Phase 2: Data understanding

If you are looking at this notebook, then you have already finished running both scrapers and the sql script to put this data into SQLite. If you haven’t done any of those yet, go do them before touching this R Notebook.

Exploring Data

The first step here is to import out most important libraries:

library(DBI)
library(RSQLite)

Then, for simplicity and ease of access, we will set our working directory to the folder in which we are working. If you are actually running this notebook instead of just looking at it, remember to change the name of the location to the one of your choosing.

currentwd <- getwd() #so that I can re set my working directory after I'm done
setwd("C:/Users/avg38/Documents/cornell/spring 2018/ds 4100/OscarPredictor")

Now that all the setup is done, lets connect to our database.

con <- dbConnect(drv=RSQLite::SQLite(), dbname="moviedata.db")
dbListTables(con) #sanity check - should show six names
[1] "actoroscars"    "actors"         "directoroscars" "directors"      "movieoscars"    "movies"         "moviesfinal"   

Now, I’m a bit more comfortable putting information together here in R, as the datasets themselves don’t really have too much overlap, so we will do feature engineering here before putting the final analytical datastore back into the database. We’ll start by putting the tables into dataframes:

actors <- dbGetQuery(con, "select * from actors")
actoroscars <- dbGetQuery(con, "select * from actoroscars")
directors <- dbGetQuery(con, "select * from directors")
directoroscars <- dbGetQuery(con, "select * from directoroscars")
movies <- dbGetQuery(con, "select * from movies")
Column `runtime`: mixed type, first seen values of type integer, coercing other values of type string
movieoscars <- dbGetQuery(con, "select * from movieoscars")

With that, all of our tables are now loaded into R. Lets take a look at them:

actors
actoroscars
directors
directoroscars
movies
movieoscars

Note that the nomination and wins for the actors and directors are mutually exclusive - we count wins separately from nominations, so an actor with 5 nominations and 2 oscar wins has appeared at the Oscars 7 times.

Our goal here is to add engineered features to our movies table to turn it into our final analytics store. Another note - in our movies table, any id of -1 means that the data was not found - so, we’ll start by turning -1s into NAs. Similarly, movies wiht 0 for runtime and budget just have those values missing as well (I mean really, a movie taking 0 money to make? Running for 0 minutes?) so we will change those values into NA also. We’ll leave revenue as is - its possible for a movie to make 0 money if nobody sees it, or if it just goes straight to TV (like the Star Wars Christmas Special).

movies$budget[movies$budget == 0] <- NA
movies$runtime[movies$runtime == 0] <- NA
movies$actor_1[movies$actor_1 == -1] <- NA
movies$actor_2[movies$actor_2 == -1] <- NA
movies$actor_3[movies$actor_3 == -1] <- NA
movies$actor_4[movies$actor_4 == -1] <- NA
movies$actor_5[movies$actor_5 == -1] <- NA
movies$actor_6[movies$actor_6 == -1] <- NA
movies$actor_7[movies$actor_7 == -1] <- NA
movies$actor_8[movies$actor_8 == -1] <- NA
movies$actor_9[movies$actor_9 == -1] <- NA
movies$actor_10[movies$actor_10 == -1] <- NA
movies$director_1[movies$director_1 == -1] <- NA
movies$director_2[movies$director_2 == -1] <- NA
movies$director_3[movies$director_3 == -1] <- NA
movies

So lets look through this data. The first column that comes to mind is the budget column.

Lets start by adding an old script that I have used before to run outlier detection.

outlierKD <- function(dt, var) {
     #this first step allows us to grab a variable from within a specific context - in this case,
     #the uffi dataframe.
     var_name <- eval(substitute(var),eval(dt))
     na1 <- sum(is.na(var_name))
     m1 <- mean(var_name, na.rm = T)
     
     #allows us to show multiple graphs in the same output window
     par(mfrow=c(2, 2), oma=c(0,0,3,0))
     boxplot(var_name, main="With outliers")
     hist(var_name, main="With outliers", xlab=NA, ylab=NA)
     
     #boxplot.stats gives the necessary metrics for boxplot construction
     #$out gives the calculated outliers using these stats
     outlier <- boxplot.stats(var_name)$out
     mo <- mean(outlier)
     
     #replaces the entries of the extracted variable with NA if they are in the outlier list
     var_name <- ifelse(var_name %in% outlier, NA, var_name)
     boxplot(var_name, main="Without outliers")
     hist(var_name, main="Without outliers", xlab=NA, ylab=NA)
     title("Outlier Check", outer=TRUE)
     na2 <- sum(is.na(var_name))
     cat("Outliers identified:", na2 - na1, "\n")
     cat("Propotion (%) of outliers:", round((na2 - na1) / sum(!is.na(var_name))*100, 1), "\n")
     cat("Mean of the outliers:", round(mo, 2), "\n")
     m2 <- mean(var_name, na.rm = T)
     cat("Mean without removing outliers:", round(m1, 2), "\n")
     cat("Mean if we remove outliers:", round(m2, 2), "\n")
     cat("Outlier Values: ", outlier, "\n")
}

With this, we can do a quick outlier check for the budget column:

outlierKD(movies, budget)
Outliers identified: 442 
Propotion (%) of outliers: 9.6 
Mean of the outliers: 138188285 
Mean without removing outliers: 26925670 
Mean if we remove outliers: 16257974 
Outlier Values:  9.4e+07 1.4e+08 2e+08 1.32e+08 1.35e+08 1.5e+08 9.3e+07 9.4e+07 1.85e+08 8.5e+07 1.1e+08 1.02e+08 1.85e+08 2.07e+08 1.5e+08 3e+08 2e+08 8.5e+07 1e+08 9.3e+07 1.8e+08 1.25e+08 1.6e+08 2e+08 1.39e+08 2e+08 2.58e+08 1e+08 1.15e+08 1.25e+08 1.5e+08 1.5e+08 1.4e+08 1.4e+08 1e+08 1.75e+08 1.25e+08 1e+08 1.3e+08 1.5e+08 1.5e+08 1.4e+08 2.5e+08 1.1e+08 1.5e+08 1.6e+08 9.2e+07 1e+08 1.2e+08 8.8e+07 1.5e+08 8.5e+07 1.1e+08 1.5e+08 1e+08 9e+07 2.7e+08 1.3e+08 1.15e+08 1.1e+08 8.5e+07 1.1e+08 1.26e+08 1.5e+08 1.4e+08 9.8e+07 1.45e+08 1.4e+08 1.5e+08 3.8e+08 1.2e+08 1.13e+08 8.5e+07 1.37e+08 2.15e+08 1.55e+08 1.3e+08 1.15e+08 9.5e+07 1e+08 1.2e+08 1e+08 1.5e+08 1.5e+08 1.37e+08 1.8e+08 97250400 2.25e+08 1e+08 1.16e+08 1.75e+08 1.05e+08 1e+08 8.5e+07 9e+07 8.8e+07 8.7e+07 8.5e+07 1.5e+08 1e+08 1.4e+08 9e+07 1.65e+08 1e+08 1.5e+08 8.5e+07 1.5e+08 1.3e+08 1.3e+08 1.6e+08 1.3e+08 9.2e+07 1.2e+08 8.5e+07 1e+08 1.05e+08 1.5e+08 9e+07 8.5e+07 9e+07 1.5e+08 1.07e+08 1.5e+08 1e+08 1.5e+08 1.3e+08 1.4e+08 8.2e+07 82500000 8.5e+07 1.2e+08 1.2e+08 1.3e+08 1.5e+08 8.5e+07 8.4e+07 1.02e+08 8.5e+07 1e+08 8.7e+07 9.2e+07 1e+08 8.5e+07 9e+07 1.5e+08 8.5e+07 8.6e+07 1e+08 1.35e+08 2e+08 1.55e+08 8.5e+07 1.65e+08 1.65e+08 2e+08 1.5e+08 1.5e+08 1.05e+08 1.1e+08 8.4e+07 9.4e+07 1.5e+08 9e+07 1.09e+08 1e+08 9e+07 1.8e+08 1.45e+08 9e+07 2e+08 1.2e+08 1.2e+08 8.5e+07 1.49e+08 1e+08 1.4e+08 1.15e+08 2e+08 8.5e+07 2.5e+08 1.25e+08 1.5e+08 1.3e+08 1.5e+08 1.5e+08 8.6e+07 1.1e+08 8.5e+07 1.75e+08 2e+08 1e+08 1.75e+08 1.75e+08 1e+08 1.3e+08 2e+08 1e+08 1.5e+08 1e+08 1.25e+08 1.5e+08 2.37e+08 1.7e+08 2e+08 1e+08 8.5e+07 1e+08 8.2e+07 9e+07 2.2e+08 8.7e+07 1.5e+08 1.6e+08 1.1e+08 1e+08 1e+08 9.5e+07 1.1e+08 1.5e+08 1.1e+08 2.1e+08 1.4e+08 9e+07 1e+08 2e+08 1e+08 1.17e+08 1.3e+08 1.95e+08 1.12e+08 2.6e+08 1.1e+08 1e+08 8.5e+07 1.2e+08 2.25e+08 1.1e+08 1.2e+08 1.44e+08 1e+08 1.7e+08 2.09e+08 2e+08 9e+07 1.65e+08 9.2e+07 8.5e+07 2e+08 2.5e+08 1.3e+08 1.05e+08 2.5e+08 1.5e+08 1.35e+08 2.25e+08 1.3e+08 2.6e+08 1.6e+08 1.63e+08 9e+07 1.5e+08 1.1e+08 1.2e+08 1.25e+08 1.1e+08 1.9e+08 1.45e+08 2.5e+08 1.5e+08 2.55e+08 9.5e+07 1.25e+08 1.7e+08 8.5e+07 9.3e+07 1.85e+08 2e+08 1.5e+08 8.5e+07 1.25e+08 1.05e+08 1.75e+08 9e+07 1.3e+08 1e+08 2e+08 1.15e+08 1.8e+08 2e+08 1.6e+08 9.5e+07 1.3e+08 2e+08 1.3e+08 1.2e+08 1e+08 1.2e+08 9e+07 1.7e+08 1.5e+08 8.5e+07 1.3e+08 1.76e+08 9.4e+07 1.05e+08 1.35e+08 1.1e+08 1.45e+08 1.95e+08 1.45e+08 1.65e+08 1.3e+08 1.45e+08 1.45e+08 1.6e+08 1.02e+08 1.25e+08 1.55e+08 1.2e+08 2.1e+08 1.2e+08 1.25e+08 2.8e+08 1.7e+08 1.3e+08 2e+08 1.8e+08 1.3e+08 1.75e+08 1e+08 1.03e+08 1.5e+08 1e+08 9e+07 1.5e+08 1.7e+08 1.7e+08 8.2e+07 1.25e+08 2.5e+08 1.6e+08 9.7e+07 2e+08 2.5e+08 1.25e+08 1.6e+08 1.5e+08 1.25e+08 1.78e+08 9e+07 1.45e+08 2.45e+08 5e+08 8.4e+07 1.4e+08 1.75e+08 9.5e+07 1.65e+08 8.5e+07 1e+08 1.9e+08 8.3e+07 1.2e+08 2.3e+08 1.9e+08 1.03e+08 1.65e+08 1.5e+08 1.27e+08 2e+08 1e+08 1.85e+08 1.4e+08 1e+08 2.45e+08 8.1e+07 2.5e+08 9.9e+07 1.35e+08 1.7e+08 1.78e+08 1.1e+08 1.05e+08 8.8e+07 1.8e+08 1.8e+08 1.08e+08 1.75e+08 1.1e+08 1.1e+08 1.25e+08 9.7e+07 1.5e+08 1.4e+08 1.5e+08 1.32e+08 2.4e+08 1e+08 9e+07 1.2e+08 1.75e+08 1.1e+08 1.5e+08 1.05e+08 1.75e+08 1.5e+08 1.35e+08 1.25e+08 1.11e+08 2e+08 1.66e+08 1.8e+08 1.08e+08 1.15e+08 9e+07 1.85e+08 1.25e+08 1.1e+08 1.76e+08 1.49e+08 1e+08 1.35e+08 1.5e+08 1.75e+08 1.1e+08 8.4e+07 1.6e+08 1.2e+08 2e+08 9e+07 1.5e+08 2.17e+08 2.5e+08 197471676 1.04e+08 9e+07 1.75e+08 1.11e+08 8.5e+07 1e+08 1.3e+08 9e+07 

So, immediately, ,we have a problem - a HUGELY disproportionate amount of our data is centered around extremely low values. So much so that most of the big Hollywood movies with their hundred million dollar budgets are considered outliers.

As much as this presents an interesting commentary on the state of Hollywood, we simply cannot ignore big budget movies, since those are usually more likely to win Academy Awards - so we should try to look specifically at the low cost movies. First, since we changed all the 0s to NAs, lets find out how many of those we really have:

sum(is.na(movies$budget))/nrow(movies)
[1] 0.7094047

Well, looks like movie data reporting is really bad. Just over 70% of our movies have no reported budgets. If we make this even more stringent, and only count movies with budgets over $10,000 (which should barely cover equipment costs):

(nrow(movies[movies$budget < 10000,]))/ nrow(movies)
[1] 0.7353466

So, 73% of our budget data is really suspect. So lets look at these films with badly reported budgets:

badbudgets <- movies[movies$budget < 10000 | is.na(movies$budget),]
badbudgets[order(badbudgets$budget),]

Running a quick google search on Angus, Thongs and Perfect Snogging shows that this movie was produced and shot in the UK, had a theatrical release in the UK…and went straight to dvd in the USA, so it’s data is reported in terms of pounds, not dollars. Furthermore, this movie isn’t even eligible for an Oscar - To be eligible for an Academy Award, the film must be shown in at least one theater in the Los Angeles area. Its likely that this movie is not the only such ineligible movie in this dataset.

It’s also interesting to note that a lot of the following movies have very low vote counts. Lets see if this holds true over most of these movies:

hist(badbudgets$num_votes, breaks = 100)

Most of these movies have very, very few votes. If we look only at that range between 0 and about 300:

hist(badbudgets$num_votes, breaks = 100, xlim = c(0,300))

An overwhelming majority of these movies have less than 50 votes, so we could feasibly use this as a limit on our data to take out the worst of the data. Plus, movies that are so poorly known are less likely to be able to even satisfy that earlier condition mentioned about Oscar eligibility, so they would never be considered for an oscar anyway. Of course, some low-vote films may have had limited theatrical releases, but word of mouth tends to be big sources of advertising for smaller budget films, so bad films are more likely to have fewer votes, as people tend to only talk about good films. Consider 100 Mile Rule (2004), which has 3 votes. This isn’t really a small-time film - its director, Brent Huff, has a pretty long history of directing movies, and its cast is known for well known works such as The Notebook, Little Nicky, Planes, Trains, and Automobiles, Homeland, Friends, Law and Order, and Dawn of the Dead. This film has 3 votes, with an average rating of 3.2.

On the other hand we also have sleeper hits like Primer (2004), which was a small independent film with a budget of $7000, had only 2 trained actors in a cast of 7 people, one of whom (Shane Carruth) also doubled up as director, screenwriter, composer, Producer, and editor. This film isn’t well known, but even so, it has won several independent film awards, including the Grand Jury award at Sundance, which is no small feat. This film has 77 votes and an average score of 6.8. So, we can say that its not the names of the cast, but the quality of the film that generates more votes.

So, lets see what the distribution looks like if we only look at movies with more than 50 votes.:

badbudgets <- badbudgets[badbudgets$num_votes >=50,]
hist(badbudgets$num_votes, breaks = 100)

The numbers here are much nicer, even if the distribution is still heavily skewed. And, if we look at the number of movies that have existing budget values in this list:

sum(!(is.na(badbudgets$budget)))
[1] 23
sum(!(is.na(badbudgets$budget)))/nrow(badbudgets)
[1] 0.01313535
badbudgets[order(badbudgets$budget),]

There are only 23 films that have non-NA values for budgets. On the downside, this means ALL of the others are NA - almost 99% of the remaining data! On the upside, though, its really easy to just look up the 23 movies and see why their numbers are so low.

It turns out that most of these are clerical errors - for example, according to Wikipedia, Angus, Thongs and Perfect Snogging made about 700,000 pounds in the UK, which translates to just under 1 million dollars. Love, Wedding, Marriage had an estimated budget of $1.2 million. Fear Clinic had an estimated budget of $1.1 million, Death of a Superhero had a budget of $3.8 million, etc. In fact, the only movies that don’t fit this pattern are Primer, which actually did have a budget of $7000, Escape from Tomorrow which had a budget of $650000, Black Water, which had a budget of $700000, and From Prada to Nada, Stan Helsing, and Confessions of a Brazilian Call Girl, which could not be found in any other site (IMDb, Wikipedia, etc). Looking at the values for these last three, we see that there is a big jump - from 35 on Snow Dogs to 93 on From Prada to Nada, so lets say that these last 3 movies fit into the pattern shown by Escape from Tomorrow and Black Water, so we multiply the given values by 1000. So if I were to suggest cutoffs for useful data, based off of the exploration done so far, I would say movies should have at least 50 votes on TMDB, and a budget of at least 7000 to be in the eventual training/testing data.

Next, we’ll look at the data for revenues for these movies, starting again with outliers.

outlierKD(movies, revenue)
Outliers identified: 3798 
Propotion (%) of outliers: 28 
Mean of the outliers: 96446202 
Mean without removing outliers: 21070042 
Mean if we remove outliers: 0 
Outlier Values:  940335536 9726954 655011224 180949045 96889998 1574623 527068851 72258126 1065659812 60740827 51001550 242875078 3357075 186438883 216763646 591739379 177394432 15992615 163794509 54667954 85306374 474968763 871368364 926287400 1118888979 274925095 1270522 178043761 119723856 1004558444 450717150 362744280 50315140 82719885 103911669 162944923 358372926 5914908 56308881 158733820 39407616 173921954 67312826 3.8e+07 163876815 152925093 786636033 85582407 93974620 2500000 1.29e+08 5.5e+08 42093706 374218673 95708457 9.61e+08 4.35e+08 311312624 9524340 22441323 45742101 484572835 82102379 113714830 3031801 156822020 62022014 368780809 2697930 326551094 11030861 185798265 152159461 171183863 49084830 26781723 748806957 34808403 120072577 383257136 544272402 41797066 705308 3.6e+07 313542341 76578641 60427839 261572744 181674817 60378584 244931766 31584901 192452832 371353001 13350369 16680836 821708551 783766341 890871626 230884728 249348933 7e+07 236350661 562816256 122919055 97607453 41597830 767820459 219417255 30641770 738599701 424988211 441818803 130358911 92180910 611899420 456758981 281929795 352114312 235926552 497409852 139352633 14980005 976475550 876688482 789804554 895921036 938212738 449220945 516642939 30332385 132511035 933959197 74558115 100523181 478207520 46 119188334 484409218 919838758 798958165 296655431 179213434 111340801 19271312 96976270 172989651 116766556 362211740 7897645 461983149 108539911 102356381 660940780 532680671 397850012 20117339 41400000 22889018 4291965 109676311 154937680 135330182 123384128 155721132 59908565 82169884 16803753 228738393 68673228 8974829 88489643 69485490 49469904 53653224 137587063 65569869 169332978 229736344 422610419 32017803 95608995 56298474 2628241 44909486 170877916 15304890 33616692 3515061 307077295 742898 83258226 289847354 132180323 98185582 13060843 35564473 6459020 14821658 5549200 391081192 99318987 86915017 78568977 211643158 48027970 30822861 143049560 94935764 217764291 2455831 1919197 64238440 383531464 102984862 129394835 120175290 194168700 131282949 92913171 574480841 14 99965753 162949164 98410061 41170784 101191884 16756372 142400065 1928985 127392239 124731534 62771059 80578934 35619521 9450897 62112895 163712074 585174222 127906624 849055 433013274 401128639 76066841 370569774 1013596 119114517 46243000 33828318 10012022 97837138 130431368 196482882 24127895 31670620 127067 19776159 162945894 709709780 1045713802 60474340 649398328 8.5e+08 203388341 162242962 38535221 65754228 245360480 752215857 75511123 18618284 42931041 84785914 5761917 96060858 51801187 173066 167298192 10496317 183474602 39143839 38610009 289047763 82466670 18928871 21786738 486021 25037897 274703340 156505388 62172050 54926886 19777647 22963701 94728529 171269535 108103450 77944725 104876233 105178561 114830111 347234916 68296293 8679814 35402320 347451894 623722818 373062864 80253908 27642707 30002758 85131830 55495563 26155781 123729176 64437847 295206 23619609 13405595 8493890 8 65664721 119137784 55112356 200276000 4857367 27297450 372234864 38862717 135560026 69474661 115505027 173013509 33788161 26888376 57490374 195735876 12 22222308 580527 24538513 132900000 419651413 249288105 214034224 288500217 442824138 55041367 1.02e+08 28008462 11588205 55157539 93354918 7022209 16829545 408247917 1.73e+08 56359980 105834556 32801173 287553595 6003587 115772733 88933562 111127553 69307224 90450008 37311672 94679598 38629478 193772504 65977295 67631903 54600000 41637263 16930884 7659918 186072214 113020255 77566815 4947717 31466789 92601050 65900249 2849142 4001121 117195061 50907422 416925 773228 43928932 83282296 26820641 181001478 75225693 33231264 141220678 220673217 178262620 78378744 10597734 129266061 121147947 86658558 154749918 170128460 69766619 2077763 105316267 148336445 60896147 2770941 14711793 75505973 63215872 74237563 342835 340487652 24377151 196397415 23803308 95226116 8203235 415252786 92991835 22942221 49718611 1.93e+08 46474 80573774 1954937 374743 34619699 11850214 15071514 9237470 33013805 333932083 234710455 41299492 163720069 60161391 219076518 141591324 944915 266465037 2466444 96408652 66122026 24748670 57958696 20440627 11130889 258022233 347325802 70016220 15785148 310634054 87754044 10289 97838349 38085778 92076 287594577 29452 29413900 8159508 1027699 20710513 77920346 77741732 29700000 9620399 57096190 56255142 719968 171963386 156835339 88323487 147845033 91354215 75 82150183 70752904 93772522 114908830 361366633 585349010 110803676 4778376 4.4e+07 119000410 160259319 18317151 65270477 11293663 457363168 4607608 5926410 64321501 128406887 26 256697520 109449237 47175038 12482775 266728738 49554002 29541790 171600000 447741 300257475 73090611 170764026 68377859 76669806 54700105 16809014 65565672 84646831 19322135 5359645 154906693 9500000 231411584 77208711 175372502 119269486 43318349 188072649 277448382 104478416 15309302 93945766 151161491 197309027 95696996 1.2e+07 28430000 6754898 495303 57103895 343397247 6971266 180557550 202026112 18637690 148412065 2.66e+08 852872 5967038 10903846 3.3e+07 25005257 73276047 93525586 91753202 7266209 1.7e+07 12036149 64352607 113019290 69823199 8342132 37707444 1.3e+07 32483410 20957001 2426851 46118097 516139 27674124 52304001 162839667 222231186 5367030 117760134 231449203 23550000 39031337 92374674 34533783 150816700 30448000 19844979 368744044 886686817 121463226 836297228 31155435 55447968 25399945 44350926 33561137 217201 41627431 7938872 102244770 368100420 87713825 14796236 13401952 212011111 144216468 163403799 35168966 111231041 226830568 96542059 179265204 90574188 63833449 55987321 141774679 68369434 28814580 6614280 64822796 13395939 11125849 7356393 258270008 19258519 200804534 59217789 3154346 6673422 20722843 624029371 273339556 392616625 54674226 67192859 22165608 42886719 35294470 27165581 11207130 13368437 57479076 102854431 25473093 64282312 109578115 122563539 1.7e+08 56309766 120455994 127766650 6916869 15007991 2.8e+07 480314 101595121 12382362 26193068 3176880 29882645 116643346 51842679 3919254 16838910 117719158 39438674 190320568 41009669 19576023 140175006 7314027 223387299 20112926 165333180 85167639 237681299 74208267 20796847 80197993 52223306 90426405 100915 28575078 107071655 72108608 170268750 24793509 1831348 3764219 98376292 60780981 149044513 71441250 100914445 259175788 167722310 117487473 203567857 179179718 160583018 119723358 12991996 631744560 195745823 130293714 141702264 17297244 285176741 87528173 209196298 36098382 335154643 18902015 92863945 8586376 43935763 85632458 26199517 17432163 95789342 158468292 11560806 96269812 52034889 275650703 129181830 68349884 176070171 33889159 21510851 1477676 17834865 21126225 1151330 109502303 49111202 37691644 29907685 4777465 18564702 4678405 69959751 42285169 25224242 25303038 147080413 38755073 162966177 131426169 42064105 330579719 351692268 41098065 82800000 56422687 86865564 114194847 27610873 41480851 204999686 7535331 77516304 39053061 26810113 13411957 38505009 69623713 38368909 207283925 40203020 631442092 4630045 381420 91038276 76286096 154648887 384335608 17807569 105173115 165335153 78382433 27762648 141069860 1.02e+08 41237648 85498534 38058335 6538177 28650575 11772461 37384046 55181129 116476887 30526509 91974818 21353303 42647449 177371441 31070211 22944502 40442437 260696994 55003135 56681566 2636637 7177143 1841260 37597471 3833507 14655628 16856124 84146832 1109660 47231070 69834815 23937870 56070433 314432665 1.44e+08 19179969 18195610 107944236 18564467 19294901 14010832 198636868 95714875 38159905 50871113 62646763 59192128 6086508 50817508 9584131 76932943 52322400 66966987 147934180 1675484 108047131 68766121 61112916 27105095 658573 48548426 14334401 5989640 1752038 20342161 10047674 11992014 96455697 11449638 623933331 54586584 415686217 117575636 76488889 39267515 80916492 58400000 177259441 3533227 8762890 17600000 44352417 101624843 367638 494878759 752600867 1066969703 449326618 318502923 53825515 270997378 86900000 233093859 225990978 212874442 72178895 41227069 53587404 426224 35300645 68729358 46471023 75993061 7002261 161451538 124914842 110230332 42105111 3148182 6416302 413454 33526835 40452643 23563727 54744738 73762516 100076342 15705007 18130888 114663461 29506464 603900354 524028679 7033683 6585516 19924033 367275019 133818283 61347797 114660784 32287044 121975011 75781642 56489558 129042871 1569918 34234008 23430766 201596308 18469680 82391145 27685016 132675402 8135031 521311860 16929123 5271666 11098131 164433867 68514844 46546197 173398518 20298207 25819961 12520799 182290266 22179430 13620075 84601681 69631118 586090727 8708932 42792561 72700000 11875866 176104344 186053725 36642838 79958599 19351569 8826094 150277 1115493 58795814 58878723 23726793 1.09e+08 92542418 30987695 69136 373967 51053787 93375151 169956806 190212113 9304609 12633747 4601043 181466833 78000586 115603229 36609966 29170410 30114487 13818181 16017403 50097949 65470529 37317558 84772742 35743308 16942795 122644820 548039 74541707 95149435 29331068 30016165 8112712 43545364 145896422 13885802 253625427 13001257 5001655 9995168 71 70067909 24829644 160388063 50650079 23936908 122489822 24185781 168167691 214104620 35424826 294804195 80154140 57223890 75395048 27053815 71069884 51142659 7316658 66468332 30536013 60222298 37664855 66002004 38275483 22400154 54249294 86369815 57891803 676698 16951798 18593156 9448082 20217080 15614000 180622424 145771527 30553395 566611 63781810 138259062 8500 38955598 64459316 609841637 16123851 1461989 87055349 97918663 68915888 58405313 57806952 17709155 1530216 230685453 14894347 71073932 46770602 7103973 10589102 42776760 209073645 119940815 8176544 64762724 91196419 68696770 41512007 16974459 140161792 3849941 35081550 21009180 52970014 252909177 81 56714147 113857533 25871834 113221 83073883 44434439 45479110 101564935 72778712 77628265 100020092 120620 113280098 128107642 18720175 9789651 10442808 13110448 113086475 1025491110 4.2e+07 44703995 41819064 16051363 68282844 32973937 78269970 163733697 74901339 297138014 2294291 48428063 26527510 23510601 41604473 197011982 603943 127814609 22852638 2336172 377910544 9323833 187479518 47738099 91353501 954305868 1.342e+09 9234510 16991902 8059140 102223269 13204291 10848783 8049666 31430334 80936232 605562 28023563 13596911 70442940 6808550 55089 14822346 741394 251495 34742066 21384035 16930185 598645 43306325 50500000 985117 38105395 10569964 240476 8900000 17741298 5364858 85416905 309979994 10089373 249905 17500000 458232 44852 16174377 17286299 1829917 7778177 31148328 834457 8768 3091922 908847 185258983 42487390 1296184 6819587 143451 91379051 124191 269958228 346592 3786801 1196307 2033165 6870249 33472850 17496992 27640028 23530831 194287 10785801 43493123 34252847 7700000 18591272 18750246 6584159 27645491 23833131 108979549 73174566 22707064 7785317 3.4e+07 61255921 23367586 1260761 356613439 45465299 4496912 22211426 5151936 7766240 385680446 16980098 36699403 14373825 245000 43650785 68397662 13678913 57588485 72028752 20380 72436439 18755936 948753 22433915 2944752 25195000 343816 36620508 17869048 31055440 307811 2725258 7e+06 16158487 276891 147880543 52900000 103951461 18948425 84500122 19158074 76514050 1107542 363164265 14109284 25739015 155446362 40855419 51155219 558000 69497 106303988 7202 1.52e+08 8380329 52277485 10166502 2e+06 7e+06 41412264 21170563 35078241 21972336 50007546 3830137 2899975 6230276 4040588 22217407 5231128 2.1e+07 14867514 30226144 2957978 414404 21 7.6e+07 2e+07 2062066 12506188 2626800 553198 18197398 735099082 769653595 12762 61746888 36351350 23006849 46396427 69425966 26522838 6575282 285000 30700000 41624046 113783 1750211 64445708 242717113 3 5410749 9793496 84375061 424760 204660 7e+06 188126 50907234 14782676 10337477 149281606 43051547 26288320 38804615 1 13196245 102836002 33456317 27388767 1984662 4910682 96105964 866999 460978 29010817 183293131 83080890 20416563 6700000 3800000 28283637 2025032 105656 473993 75597042 8642858 186702 1200398 21888598 163000 3669465 5542025 153205 124596398 12 22034832 302469017 135680000 37095657 165888 13391174 38793283 48563556 12671300 12398628 10959475 34560577 4574762 223839 3020784 75871032 2506446 73034460 54947 16627188 12764201 81368 8786375 11400000 92380927 121059225 1410778 25900 48000 109421911 15431177 381509870 14793624 2955039 1037335 973525 16605763 10013424 83398 2043704 90508336 11341016 333912 819939 220151 5476060 391410 3.1e+07 44872 9216 666045 10719357 2e+06 12923936 382267 29381649 2960993 66456 21800302 900689 117224271 38869464 2186782 1e+07 8936663 9950133 14879423 7096000 10 100086793 91636986 1117920 6e+07 530048 19551067 5048693 17164377 21148829 163536 16872671 881787 4720371 1163450 109862682 41939392 13276953 1.4e+07 69932387 26900000 104945765 319131050 90810892 6101046 4856298 24007324 87784194 136267476 33082548 28818995 712294 61141030 17280326 6 3102550 637769 31720158 73830340 32474120 2556911 38399961 9760104 382174 1800 1.2e+07 4100000 371940071 1143856 791867 62357900 210819611 1007962 23978402 15368897 32645546 1046166 18599102 325233863 7070330 102471 155545279 68688831 95687 69564 709827462 317375031 31878891 1347988 18012097 413106170 32721635 1017401 634074 150166126 40828540 2260712 2281089 27769 1667192 55534455 1237615 77527732 459270619 232713139 143000 1548955 10178331 31651 36348784 163169 73 31179516 1079726 14899417 35097815 44460850 292817841 7133082 6149791 15345201 20645327 171844840 51416464 102391382 186167139 60722734 12032983 122444772 31556061 2787965087 6413915 108332743 33700 295750 5923000 543513985 739690 7e+07 16702864 157107755 400062763 10539000 310669540 27635305 2025238 61458982 8e+06 57881056 40222729 365134 837000 205298907 209151 1051948 261603 5101756 41596251 65070412 10652498 1.14e+08 7808524 2434658 19791 32 5530764 13308 2277396 17436509 9366227 9250000 952820 1896244 47664559 317000 12206028 242988466 16633035 126690726 68233629 10629321 42333295 33333531 60462347 41162041 309208309 6000 67918658 219103655 69055695 163670000 92219310 122233971 70742948 114977104 94882889 112462508 64572262 20455276 31912793 1162422 154026136 56032889 45236543 12225023 443140005 115664037 1179676 96188903 4706919 254190 2.4e+07 215339 2037545 89792502 31327899 5409517 40105542 55583804 6814789 193355800 7644937 490475 698491347 1.9e+07 10372291 13022756 101543 1725381 67126795 28169671 101229792 1519557910 85280250 2357852 6126237 26096852 129540499 296557 2.6e+07 1449945 10424470 17040871 28972508 4388563 29922472 47405566 33965843 36133014 6405245 5802422 639000 47536959 144008 10329747 42538454 42345360 70569 776691 19152480 52826594 36440201 39041505 260 19693891 27206120 51 199436 852206 2479538 62852 5800000 46488 215283742 111731 825532764 13102295 15134293 1.36e+08 293329073 274470394 65464324 170432927 51070807 6153967 5129058 2995811 270210 1.4e+07 7875862 1521261 173306 47801389 1e+07 8459458 2.9e+07 875386 1100000 80768 232732 54956140 371396 15530077 10113733 1429299 5837674 7e+06 4069090 10011050 42145 2331721 2402459 9109322 21500000 17872796 4922166 1e+06 23000 18409891 1e+06 18088 3481387 1675706 1325092 23311391 226497209 90029656 216485654 7810000 887029 1628154 152810 43498108 20719451 20867919 134748021 49779728 34300000 16441438 5e+06 4245870 177238796 18634654 21409028 754249 24964890 44462 49050886 77477008 23580000 126248813 93246388 152263880 36236710 88335 34100000 60072596 105090 300228084 3347647 3.34e+08 3606395 599045960 155010032 128905366 407711549 459359555 431971116 5024782 47527 19406406 69389 22730842 263941 48795021 3.6e+07 4270000 260095987 278731369 1108561013 7385434 74952305 288347692 224920315 98159963 261930431 30638 6110000 6.8e+07 48190704 226904017 27362712 127869379 321887208 42045846 21520719 43165571 6 204594016 32005248 169852759 26121638 78309131 83615414 1123746996 58785180 67738090 24188922 271430189 105610124 7 1644755 22000 867714 1183258 357852395 83761844 34710627 237382724 591794936 86387857 27293743 7306 5753490 13831503 140987 50673078 2891288 299268508 1422910 310650585 4790751 60251371 97552050 71664962 137551594 112483764 34705850 744816 771499 18492362 80547866 6629178 2566717 227817248 39187783 624026776 18928 5602431 49830607 265318 140073390 159291809 37895 23081726 30 24145613 177512032 136150434 97138686 7022728 851517 563749323 201584141 123820 11650 147780440 2227 211780824 17566040 9455232 967000 3045943 89519773 66821036 27046 48668907 563706 229147509 102820008 871279 51148651 1068682 83188165 1023156 174318 320092 52604 430041 6491240 16504936 19829957 4242978 4634062 352810 103735 538000 572809 1755212 1e+06 47088990 18124262 10474 33583175 167805466 9479718 35692920 4882577 3453043 527000 327803731 16344 252276927 3065860 6900000 67112664 1e+07 5900000 105197635 1e+06 346594 7871522 13004198 46495 185770160 303025485 382946 64076736 753808 219851172 202466756 3.7e+07 120000 3317662 12000 18000 6732980 324138 1296937 254455986 230600 414211549 20601987 93617009 1083683 18 852336 2527904 147332697 98017 498974 2614773 189712432 268431 168406 1 25147786 90275 4159678 484635760 36993168 312642 41424067 245000 11087569 144492830 400654 16566240 8454301 539957 5476793 71904 850994 464000 453079 215576 1.5e+07 43300000 28931401 96263 5132354 416498 163265 80 48398 389681935 21024 304654182 346147658 130786397 96047633 27462041 45636368 108609310 1672730 51723285 40 1104682 4644108 83160734 20348249 748453 45735397 559852396 6063556 217124280 97009150 864659 57777106 1084939099 276572938 716392705 41037742 1021103568 665692281 27122040 80630608 585178928 75450437 662845518 61648500 31083599 46221189 284139100 173930596 353624124 5e+06 89162162 174822325 16178959 100477 52545707 93477 71594792 124272124 12207 7732325 249204 4349187 2500000 38992758 85412898 25562924 183953723 122575 63782078 150483765 214918407 2500000 17479 712171856 8.29e+08 142851197 24159934 6928068 970816 3538446 8020 19504039 841733 53213633 14000 14460000 1188194 159429 1611000 626137675 1.17e+08 10130000 43059790 145570827 5980 59389433 161849455 97000 144633 1126525 790421 908000 33245 2281585 6861102 309973 12884923 14623 216197492 132274484 1.02e+08 160112671 149337 204940 337580051 90425 17511906 11790979 36893721 4 467365246 103071443 100202 98441954 14944 293793 2295733 693181 1339650 22270 464991 33662874 342695435 5332926 1776935 35387212 10967 1759252 288383523 10654385 11455 157887643 114156230 741875 3e+05 10 85564310 694713380 253899 1.36e+08 3878993 4627375 3218666 31649 13521829 37710610 876302 22939027 958400000 3.01e+08 89289910 177584879 1e+08 14624826 21878 34942188 3770657 15240456 877244782 7556 24922237 187361754 1749457 160078586 8106475 78396 16374328 621951 8212430 203373 334615000 396600000 101236 17555141 1332231 13651656 133771 152930623 1378 11411644 1279 151119219 63931 55282 23057115 4430765 6467348 3964682 399611 60700000 39667665 36160375 208076205 156974557 432274 82087155 47042000 17273593 18662027 321000 14166853 24426169 587615 224803475 110206216 15478800 3542353 355688 35485056 44806783 28128670 52302796 40836 404 482860185 15395087 3142154 538983207 40547440 743559607 245527149 35287788 21817298 5728213 302000 183018522 60965854 95404397 142044638 46352 429766 3012210 5774854 3e+07 30426096 610986 951179 3100000 10 43880 664747 165184237 198802074 10324441 1406224 351040419 55247881 150962475 201585328 37930465 78054825 3099314 44907260 590000 10126458 177243185 223959 127730736 5206 232617430 150406466 330048 225861 14870 2592808 386749 96070507 18663238 19560274 74597643 425368238 1215439994 28258060 286140700 407602906 24261569 491868548 23737523 232324128 433677183 114178613 1969193 63543328 623528 38502340 88025781 9489829 691210692 33372606 29657751 9612469 2128186 15699707 55125 26488 30551495 176669 403170142 64626786 234989584 8493728 149217355 240159255 114956699 6011000 6038942 51854875 149673788 549368315 27603069 531865000 118338361 53909751 34522221 22044277 40346186 50365377 68945 957240 355692760 371876278 196114570 205703818 63327201 282448 10076790 275293450 4100000 3696232 3665069 5576725 348840316 5634828 7448385 1677 72689 18050000 120081841 10759 136836156 133432856 171760 91260 12355798 77278331 286201 286168572 972512 13551174 117698894 81272766 218340595 9504139 35057696 312573423 415440673 5e+05 1.87e+08 174578751 644571402 378858340 108348 101758490 54819301 358375603 179379533 79700000 22321 2054941 117831631 3e+05 1.45e+08 183987723 95311434 48126384 107139399 5446000 426480871 39881 1585582 63100000 17011 99357138 3759582 85446075 167221571 347434178 16863583 209696 282570682 126546518 104907746 10337387 704 1e+07 613252 108282 505675 540152 24719215 36433975 18100189 152 9627492 175706 303877 68267862 12186625 125537191 180274123 10158000 746921274 7401480 59418613 868439 2550508 1189612 197687603 34564651 306941670 9696204 25345000 32204030 73244881 1353868 44287131 77712439 82966152 4417580 5310554 53676580 116980662 376141306 11417362 105200903 41863726 471222889 236412453 441809770 114281051 243843127 609123048 272912430 142817992 788679850 130482868 236806 68263166 13231461 8784318 5355847 134634 14347000 1653792 181107 11947954 21107746 3094813 1328467 319285 8326 1243961 1576687 327345 24995 714544 3325038 4007792 419953 376597 288312 100345 3200000 33400000 44349000 140470746 306724 9114264 8303261 134906 12077441 7200039 32935319 362637473 566006 29844753 33035736 20400 28883511 440603537 98337295 58058367 22930 12096300 19633027 2401510 161772375 8887603 4861022 21819348 32438988 73100172 609016565 9636289 24637469 119772232 7594693 101702060 84606030 1941667 1663931 88058786 3010 338987 25000 30905 1091405097 15489307 3838 1162635 23859 13101672 9206470 21291 970761885 9747 18112929 525 4105187 30353232 34153101 14836 3003 211952420 9622846 90247624 68929150 19145732 242688965 25762027 35485608 5380251 15608545 66351 132820716 1e+06 4132000 2521 19701164 12434778 477200000 5297232 1405403694 169837010 71154592 6748712 1632 714766572 252603 1072602 32726956 847423452 175742 102388 48600000 250 18074539 705717432 3.1e+07 758539785 89237 519311965 641100 9128263 31081 16800000 21587700 7034007 1165882 120680 331926147 1832541 1100000 392000694 15008161 48065672 122915111 46089287 71009334 95020213 126041322 16549477 246984278 63372757 9.5e+07 97542952 173965010 362000072 173649015 1274219009 248384621 60052138 14400000 56825 30655 3903479 12250 2341226 86758912 857522 3302463 98682 166000 318982 1234254 40400 81071 1065881 36894225 23570541 97594140 10550 9138338 115350426 5e+05 95000 175705 13785015 35931410 6294161 268426634 4.4e+07 188133322 73706 205366737 161025640 116207 61782 21766271 773328629 46216641 710644566 15600000 174600318 884100 18295 258656 519535 2.3e+07 59520298 240697856 1005700 717205 11879046 1562546 4069826 31724284 1775316 85154 21 1402307 87100449 956019788 58510 30668 74918 4534 3623330 90565421 444575 273747 83519699 27437881 50000 529076069 79358 10016934 8109160 33400000 232380243 50353002 1697294 3346265 1066471 1028570889 2106557 14056 3428048 22309223 747862775 45250 148671 117090 610792 1347747 3566225 17654912 6508 117629 20275812 1486 752100229 653428261 146497771 11176469 115922175 1e+06 8138788 82394288 86175291 5876918 42930462 6842058 2293798 1513528810 131940411 8352885 158674180 203277636 346864462 53830415 134402450 135511030 469160692 370541256 197183546 30800231 125 206172544 1938 5750 269994119 318000141 60141683 311 14567 4636169 11384015 14752 111300 19684 521170825 2068223624 112544580 3e+07 7176347 655894816 1.7e+07 2 17508518 1.8e+07 11724119 100 25174316 444098 80383290 200406 12639297 15179302 5750401 10501938 122126687 62616646 51164106 78096553 71625195 25109572 1469 268031828 126 23198652 69 117932401 24186232 28234657 857611174 543514353 1e+05 2.08e+08 219788712 1034589 55198285 5867686 47351251 74188937 19255873 6108720 1031243 154984035 10631747 455815 3462 2.4e+07 349779543 13983 35022 19054534 13809 192330738 228 33621 2159041 75143 675120017 288747895 103039258 17385830 2963902 6854611 1784763 44030246 271755 33821 985007 770706 9494789 2295423 2365467 31554855 1338365 68572378 89328627 209154322 89661 2063312 21833 81381 602042 9195 473226958 18642 2107925 99206215 8555008 1553826 176391 12400000 15400000 1.8e+07 2915767 167977596 794191988 62076141 5290 45431 1133031 1506249360 153997819 251171807 2405420 3639345 1503616 1600000 53181600 108255770 11110975 645186 6833445 1.8e+07 500188435 27187375 343341 120000 19613 135039 137460 312242626 2570000 4187 104810 13769 1397284 105 20300000 22456509 7018189 1.1e+08 2861020 48390 3485127 657818612 682330139 9800000 19978961 32846 325000 2627209 42067430 3324330 32230907 349424282 1325937250 3396726 37884 208588 460 70181428 243400000 188441614 59209 258384 61279452 49263404 110577 343471816 466088 24084 542307423 2415472 1.8e+07 23578 4235151 11294 52597999 340911 523511 27330000 54418872 70918 1749201 4507463 641 17137302 729043 196781193 17834867 7972967 121461 41 7171 149295601 136621271 103215094 268157400 4811525 133821816 342183 1064454 104399548 38307627 63464861 348300000 2640850 5496951 9630444 175000 846704 1055 28831145 4439431 74679822 17752940 21847 68129518 108145109 4878242 76586316 43058898 15447154 100129872 150680864 83719388 9930095 233555708 16505460 93820758 3e+06 880674609 414351546 809 220021259 135026 151831537 34592118 79 873260194 3430018 265452 64065 653651 25288872 15298355 54915 2225098 10900434 7800000 67347013 1675381 16971 4635300 369330363 30418560 121179 9221 1156730962 99067206 7847000 4793 122 45967935 29200000 2681345 3346257 383294 350006 217022588 26576000 2340 571006128 160602194 72287783 5155325 19682924 100654149 70958 151165787 50 81170000 102617 6860853 10 49002684 307166834 26250020 229094 140705322 212902372 92100 28208 26049082 222809600 12601706 126069509 100525432 34077920 66980456 107670357 163442937 86362372 32300000 1200000 6399 32248241 52424533 246233113 34227298 211817906 368871007 311594032 88880821 45710059 63013281 97437106 388 12342632 2633527 52501541 51029361 7500000 5e+06 5483299 1359910 35991087 123494610 30127963 8821329 7523634 3387000 67800064 101332962 45300000 30523226 108782847 235666219 560000 16337881 54837234 31911598 35926213 14431253 41296320 45000 13842409 126546825 12007070 52425855 17671101 6341855 299370084 71561644 14618727 37473 581011 2367161 15071 56574 513447 600896 6676471 103590271 38697217 4571025 561085 86165646 461162 95437994 206909 12314651 64110728 1066981 336472 2262223 59744 427418 169976 1430655 88273 1075178 5284309 32251 13092000 16002420 5578519 5405500 6212282 4719695 21026290 17472 88761661 111996 27312 2450846 1171559 8034 1826705 543934787 6900000 1851517 2303489 6075 3123963 81967450 78874843 2227167 29789000 3002884 1477002 255273813 48911 30229977 161 156021 53086 100 1625847 7587485 10429707 79799880 25312387 13684 21571189 203427584 3020664 632542 316472 470490832 9318 15656193 1124445 287506194 68896829 14947 3184472 32556119 143101 3758328 1e+08 40100000 153962963 694600 15520023 10835752 107597242 6485961 133718711 111811453 750000 194564672 243637091 10898293 21256 158162788 1558836 3425664 5758519 10285896 47309313 40272135 356743061 233755553 809342332 320170008 112343513 22678555 126150 8265 325771424 383715756 98837872 27139524 2.3e+07 295238201 179246868 64493915 2606000 59700000 616801808 6341684 35401758 3442853 36869414 122513057 3494070 4396821 1359497 27007072 83061158 42070000 105011053 13644292 223003 2333684 128388320 123726688 5681622 25182929 2756 205754447 183345589 282358 85978266 125289450 51680201 1023784195 4212494 14674076 63647656 1.5e+07 58500000 11774 373552094 1153304495 28641776 140795793 3286448 94061311 154701 43528634 43967255 155760117 14860766 84025816 66787908 187674 242786137 275000 101134059 13191 146936910 65400000 146175066 303144152 41325328 1289998 17062499 42972994 201634991 62882090 32163 643331111 408579038 125729635 966550600 23083334 1169603 104303851 29355203 488533726 532950503 407778013 7527232 13865435 1411927 65460 37151 296485718 52882018 25956113 152761 863756051 677718395 854229371 2360281 3447633 45895 43884652 166775 25434291 1178196 39171130 779820 1822250 365522 61181942 630161890 18612 85512300 6272403 11720 187112 794452 108808 61788393 72629670 3214116 26501323 192400 13162475 4453524 62788218 57607521 11486 164602163 34854990 593683 9.9e+07 262921 5659286 3885342 53647 60 334901337 94073028 1473809 1e+06 26667197 566652812 7205 3003169 24902723 783100000 30930984 24527158 65663276 8235661 104507 311256926 143695338 16661077 498814908 3400278 2800000 36606743 207945075 165478348 104384188 52395996 14016568 454516 121790373 30911 745600054 821847012 1646788 98450062 42664410 230069 109906372 278300000 228136 121545703 8306690 159047649 69411370 52099090 6423381 2541554 50465228 1055287 11122090 1333124 45000 3295624 2084628 14708696 37279439 13603453 100 1986615 88923251 216972543 155160045 61768190 93282604 1978592 61619773 60273173 142337240 573335 64191523 231737 91709827 1301696 1100000 643557 702354 86234523 615816 3643591 245623848 771317 17986781 130541 2500431 31309 7087452 97571250 7449681 40423945 134552 23964782 2e+06 6512004 4250507 331957105 1500000 173567581 3351735 69929545 445435700 3220371 8574339 88346473 3727746 1e+07 70 880166924 48902953 169801921 9188 77068246 399979606 25035950 180851 118587880 10367161 3621046 133346506 6490401 1236094 147315 46152411 14444999 64188367 1263521126 34441873 50363790 1702433 57814445 116873 67790117 124827316 78636257 24804129 140779 494506 32540674 171539887 415484914 175302354 7545758 311950384 1031552585 108758521 14333790 15436808 469311 55030051 16775 875457937 85241496 58978653 10232 41387687 2000 40055439 55969000 203388186 13082071 4631 1056057273 18730891 443684 2801508 29918745 5777 8413144 1787926 182379278 119100758 1750000 6174491 42426912 18704595 108286421 6179955 34694 4500 162360636 14394097 4444 9420546 14397593 385284817 3793739 7227038 5879736 19980 75026965 140302754 55553277 46069568 30658387 81705746 632443719 259239658 605425157 9705840 4100000 200242 572212 1777043 157768 551760 250000 12975143 4267218 133511855 1238764765 2341534 23020 37589296 23229371 4218 43763247 226945087 15861566 8996802 22586863 1 177856751 28335113 23600000 225164110 3021345 73983359 20497844 3603484 1751330 1087585 3924527 29252978 1305195 26559557 645135 9496130 95673925 378827494 2351359 20609977 400 162146076 394247609 4842699 148868835 87416021 217644 92924405 700381748 217819389 81093313 653951 173185859 133332 13819139 4210454 1605463 23507567 4505 4886 1500000 45172994 4600000 939101 20381995 48418160 84618541 11472454 928901353 111757995 5042014 183600000 22667861 700920729 80 4417667 118034273 11 6170998 16458 6.7e+07 201719 238470033 3330 14332467 114 3129507 287195794 12522 189000 156844753 14793385 2400000 3342697 12561251 13624522 23316139 119520023 2152738 467363 27129350 23200000 43070765 40840 187145 60845711 5000 343617 260354 35000 525573161 3933000 2216318 12421716 9101546 55000 3162153 6101904 400 183936074 18803648 13960394 65046687 880474 8810591 102205175 216909830 34820846 230698791 278304578 194647323 230000 553810228 193677158 3775000 4219536 1947099 29790924 114501299 100659 50548152 33486673 64897007 261465 354363 269980 12283800 43733193 1.3e+07 3787711 348322890 10051659 64414761 4100000 292279 5672618 280668 184770205 100541806 5796490 27452703 305092201 1783421 1 5972942 45056771 12141122 6069605 1.1e+07 22040908 25442939 185545281 2205074 47299234 114845157 252 34283740 9800000 40343446 418940 81182 4073489 12725059 44235023 557241 82703 5000 477815 16790139 3 1 230 2e+06 1129408 7123919 226286 11942780 3376375 3773155 9771 9200168 165 1015744 78406174 1.7e+07 3e+06 4800000 54563394 26800152 34000284 40120144 554987477 140799130 17768012 500 1200 1500 255017329 600 119261377 161626121 63570657 39 26251899 4077333 2400000 3000 98875012 15584255 128015 7 70978 2026499 83154557 450 240978 56100000 7494 307871 731607 1.5e+07 117883845 14301505 20000 1 6e+06 50000 143961265 44264523 958032 1 7800000 31100 224160000 300 1 113000 2587072 10000 8e+06 205800000 87465 10 5500000 1000 12 1370 500 1e+06 17 5 10 10 19052 15 232324128 10 

Oh wow, this is even worse - so much of the data is 0 that EVERYTHING ELSE is considered an outlier.

So, lets look at just how many 0s we have.

nrow(movies[movies$revenue == 0,])/nrow(movies)
[1] 0.7815358

Just over 3/4ths of our data has no reported revenue. We could try to impute this data but that doesn’t make much sense when 78% of it has to be imputed - since we would have to build a model to try and fill in the values the final collinearity analysis would suggest that we take out the revenue column anyway.

And frankly, there’s a small argument for taking out the revenue altogether from the analysis - take a look at this article:https://www.thoughtco.com/lowest-grossing-best-picture-winners-3875691

The Hurt Locker, which made a very modest $17 million, won Best Picture over James Cameron’s Avatar - the single highest grossing movie ever nominated for an Oscar at $2.7 billion. Seriously, this movie earned almost 14 times the total earnings of The Hurt Locker in its opening weekend alone.

Some more research reveals that most of the best picture nominees for 2018 didn’t even break $100 million. So with all of this, we could say that we should just remove the column, but there is one place that this column might actually be useful - determining ineligible candidates for an Oscar. These movies would have extremely low earnings consistent with not getting even a limited theatrical release. We could check this by, say taking a look at all movies with earnings of less than, say, $30,000. This number isn’t completely arbitrary, I went throught the films with low revenues starting at the higher end and just looked up movies randomly as I went down the list, and picked the point around which I started to see that most movies that had either direct to video releases or primarily overseas releases - which would usually disqualify a movie from an Academy Award, as it wouldn’t be released in LA county.

So with that, lets take a look at how these low-earning movies look:

badrevenues <- movies[movies$revenue < 30000,]
badrevenues[order(-badrevenues$revenue),]

Notice that a lot of these are documentaries, concert films, making-of movies and interviews, or tiny independent films. Take Blackaway for example. This movie has some big names in it - Anthony Hopkins, Ray Liotta, Julia Stiles - and only made $16,000, since it was ONLY released to international cinemas before being released in the US over a year later. So It seems like $30000 is a fair cutoff point. You’ll notice that this isn’t a perfect cutoff - there are a few films grossing more that are also ineligible for an Oscar. This is fine, I’d rather include inelegible films in my final dataset than remove eligible ones.

You could also ask why I didn’t look at popularity to help narrow this list down. That would be because there are plenty of Oscar eligible movies that aren’t popular because they’re just plain bad - like Transformers: Dark of the Moon or X-Men Origins: Wolverine. We want to keep eligible films, good or not.

Speaking of popularity, lets take a look at that column for outliers:

outlierKD(movies,popularity)
Outliers identified: 918 
Propotion (%) of outliers: 5.6 
Mean of the outliers: 27.59 
Mean without removing outliers: 3.92 
Mean if we remove outliers: 2.6 
Outlier Values:  45.4212 55.48254 32.08468 19.98001 14.75092 24.07623 29.53784 44.26686 19.156 22.66582 24.79164 24.04838 17.22634 16.26853 19.35986 26.5113 48.89694 41.82428 42.07346 37.4014 26.91715 18.85897 20.26197 30.7721 33.76535 27.46152 54.84676 28.40806 30.00502 40.42585 26.30396 18.1387 24.08487 31.12644 27.64587 46.63636 28.53599 41.21242 39.34261 24.45711 31.76968 18.63705 22.58876 27.13343 23.31146 29.97866 26.58967 16.2631 31.36713 23.71586 43.82052 22.10095 17.59031 19.12927 22.81373 15.55669 33.1336 19.07002 34.23371 31.25682 18.77989 35.42325 23.86731 17.46408 24.75804 22.17673 20.126 23.96583 21.40896 38.6996 19.44481 23.19339 22.24536 23.49795 19.88372 25.20518 31.40147 24.49421 45.24956 31.84055 24.89992 28.47011 40.07116 23.18314 21.16679 21.70339 19.56273 25.76593 15.92454 27.78542 27.40628 31.04089 27.77376 23.97235 18.85206 21.61592 18.7325 25.14245 21.44219 21.10938 36.38704 22.9387 33.68249 35.41466 26.0193 23.90832 32.39943 20.37022 19.81281 13.68949 21.98125 18.57418 19.85758 17.79701 23.20461 15.55302 32.66604 21.86505 20.05919 24.31024 24.15223 27.21287 23.43819 25.01988 28.04252 28.20487 24.85479 18.63937 25.17875 20.41081 19.36443 19.0413 25.2998 26.44543 22.04615 21.20403 34.27 44.99644 24.78165 22.97144 43.50296 14.09135 44.53939 24.26635 23.64886 23.28421 17.90949 28.62251 33.94891 22.22892 22.58562 23.51322 22.69738 24.71694 18.83083 28.74014 14.95142 22.10125 34.87166 19.98106 28.29228 19.24636 16.77876 18.18821 20.9869 21.87203 21.56619 16.83178 20.87351 31.14628 20.58607 19.47109 17.32863 24.13297 18.49456 22.3505 26.64132 20.44818 21.85028 14.00397 17.35363 23.75927 24.16638 22.54489 21.96025 25.76446 14.12578 16.5362 19.43384 23.61759 22.31448 22.09116 14.27407 21.8767 19.05879 24.48574 22.20388 29.38496 28.35882 21.82093 20.97975 14.27617 18.82383 19.55303 22.1357 23.58393 30.07628 20.86602 21.10494 26.89371 24.37673 22.15663 20.55545 19.46807 18.21157 25.89579 14.5828 23.84082 21.42077 24.03361 21.57865 17.67274 14.94712 14.48381 14.74907 21.66819 17.47282 24.01532 22.28004 21.0428 16.31163 23.41099 16.07028 22.60841 17.93164 22.11434 19.15432 19.72356 37.10988 20.50892 15.84951 15.63589 27.32045 17.26197 25.54164 21.1195 21.82084 21.74291 26.53097 18.81271 24.41916 24.60122 51.19131 22.7113 24.95744 15.27949 16.95748 26.719 18.4477 28.2999 17.9339 18.57759 22.49075 21.771 22.87321 27.12731 22.62731 28.86811 20.21841 18.33906 20.91609 23.22081 25.40604 19.27957 22.32969 31.33501 24.57173 37.11344 26.2569 18.34393 16.72392 17.34618 21.61536 42.4951 27.69471 22.4924 18.13483 43.24694 19.56744 35.14194 62.95955 25.61573 19.53781 18.53051 20.81924 15.14616 14.88596 14.40426 22.018 28.99943 19.5546 24.40487 21.24079 15.0424 34.40367 15.49662 29.20339 23.59008 15.72602 24.45558 20.58273 25.0105 24.47424 13.94655 17.74585 14.05844 21.29922 16.88371 14.89608 14.2354 17.23992 15.59782 30.50649 17.84173 20.36603 23.90517 19.18504 21.33845 15.02145 23.28783 21.59732 27.65587 38.39173 18.5577 14.25948 14.83899 17.94312 27.75151 22.75237 16.63864 20.44289 14.12339 16.04449 21.57057 23.53161 38.6964 17.67745 22.64131 24.61483 14.186 22.34028 14.19302 16.69473 21.4473 15.43798 14.42639 21.45359 16.44267 35.71407 22.39762 25.6296 14.39955 14.3372 40.71564 23.27727 18.1971 29.54751 24.16063 17.93046 21.53671 24.98002 20.5499 50.09157 46.72746 19.74877 25.19019 24.19929 25.90399 24.7193 21.95951 15.71997 29.98049 14.68444 21.21725 25.25736 26.31578 17.35505 22.93239 24.48667 18.51585 24.95738 21.96784 19.11598 21.93877 35.57916 107.327 15.02461 20.85843 21.62285 23.06673 47.08882 18.19954 29.10537 37.08414 22.15603 22.71394 20.15532 22.73509 18.81814 23.9757 23.85106 17.41334 33.48643 28.74467 27.79797 28.62307 23.63364 24.62174 41.00317 24.28637 29.77142 24.01449 21.48239 20.21096 27.5249 21.04167 34.82761 28.43989 14.86675 23.50127 28.24739 13.98151 16.39907 14.06983 29.93678 18.15106 23.95377 19.66753 14.18804 30.37712 19.56608 19.93665 24.97622 23.15473 16.21305 21.98055 157.6008 21.07589 25.54723 20.99411 21.53697 27.30654 20.79398 18.89805 19.71043 30.26882 18.21074 19.67347 28.21243 39.68854 28.81088 40.42125 16.369 30.85222 15.08376 37.62032 24.76002 19.38314 31.6989 37.46091 20.28836 16.34002 25.42681 25.37998 20.06273 18.73356 24.1618 24.99456 31.30457 37.86154 22.72321 22.91687 14.599 20.39672 22.34451 14.40008 14.33653 24.22653 20.53743 31.37263 25.20303 24.41796 14.00461 34.25582 14.70407 27.65887 28.29707 18.03451 22.58499 21.06961 28.09138 22.85623 14.1104 26.98148 17.83811 13.69139 34.31598 23.2341 18.10882 19.06535 16.72338 19.66886 27.28881 29.47801 23.98655 25.20376 25.75208 27.68866 14.78222 42.30338 47.5233 31.35913 38.91619 19.24594 14.59433 18.45568 16.33769 23.40949 31.97977 25.55846 15.631 20.48816 27.76231 15.29706 23.89502 25.64139 13.80719 27.20696 13.93191 23.82761 14.00119 32.93639 23.66778 16.25026 30.74987 28.76826 66.13014 55.5443 16.00725 18.68437 21.07469 22.12339 43.18953 22.24307 25.42356 14.28822 14.08401 22.93957 31.00384 21.76064 27.29185 14.1861 31.75107 26.79854 31.54297 55.91552 24.41621 18.64007 26.98423 22.74303 14.85855 28.86706 66.48552 15.28701 27.33438 21.53584 29.05327 16.82719 40.60927 26.90868 38.25019 20.09635 24.66336 30.28256 19.83603 29.10193 62.31726 65.77324 17.92379 34.76349 26.54259 18.75633 38.36515 43.87715 42.13061 25.86208 26.12996 21.82338 25.22079 25.65522 25.45739 24.87513 47.6312 31.84388 21.64599 30.1109 14.06029 96.89646 57.31233 26.12151 14.57045 27.04867 65.97805 25.40502 35.33159 19.4325 27.25303 30.80578 51.52299 72.76859 28.15231 23.91057 37.56307 24.65144 26.80144 15.1936 18.19399 15.13523 31.50901 19.9169 14.35435 26.59044 27.77986 15.13288 35.62877 50.59613 116.6297 13.70813 26.34962 32.53138 36.70854 51.86044 49.94384 29.68343 19.1571 14.80021 46.36093 42.74075 35.27964 22.18962 47.04111 16.18627 15.6127 51.26118 14.34475 38.79194 15.86477 18.36964 35.87392 41.41797 13.9899 25.24941 251.8692 42.30351 36.28734 30.17396 15.69107 23.70502 18.60211 45.38329 14.65068 16.90857 47.61396 108.9423 13.85271 17.53325 30.48485 29.35774 15.47516 48.81427 27.53663 28.35029 58.22907 21.93908 17.00523 60.15378 56.17762 22.71106 25.07949 18.51614 49.80317 15.36948 17.55892 15.97443 23.71207 22.12421 34.40547 24.01511 58.21653 14.59215 37.64935 14.64946 28.30984 25.74127 14.63635 36.58096 14.59366 15.12679 16.57366 15.26149 19.76518 14.7674 46.13956 18.48698 14.96711 20.44475 25.87761 104.9214 38.80084 15.77411 16.47624 14.15957 28.91822 48.37825 24.3278 19.73332 26.24433 17.11631 24.54912 20.99547 18.21943 14.76385 29.28597 14.88084 46.2279 14.76715 14.4356 47.75424 31.63952 32.89079 49.83515 15.87599 15.6448 79.52384 26.67125 38.50226 18.29994 32.32495 23.15276 15.86199 394.2405 43.20568 22.33316 55.55479 14.26405 17.33692 36.29867 16.4069 27.2315 22.68189 13.87745 27.13595 23.19999 34.20732 16.97325 15.442 51.33623 22.98796 25.96344 31.11445 47.4758 33.51269 132.5188 31.62943 32.86125 15.30868 24.16212 17.47504 14.75204 14.74662 30.62538 35.15144 31.94974 26.72849 39.75791 15.34109 30.30367 14.96383 17.40112 52.06355 24.29621 14.64107 15.54235 15.23231 33.64811 15.00619 15.18241 23.89903 20.90761 37.20083 22.57031 15.9098 32.41491 15.03759 34.52565 15.19634 14.12398 14.88867 51.12014 40.97679 69.45881 18.84326 27.4173 152.6255 21.84694 38.94633 19.91127 42.96498 16.62404 23.95751 30.74502 25.42676 15.32788 16.77163 27.68713 15.65451 14.48695 25.47968 21.76528 16.05915 68.07303 24.47192 19.59794 45.86121 24.06077 43.90694 23.19411 13.8037 48.45644 20.36556 14.17177 28.7721 47.39973 14.75821 15.77545 54.62732 14.09702 39.23174 30.53842 18.29601 124.1622 73.49327 43.83344 158.8831 21.7626 299.6385 49.39681 14.12397 33.25289 14.19092 14.62175 22.01829 17.64204 53.8873 14.46451 28.69394 17.02085 24.2093 38.91012 20.72234 43.77365 13.84989 17.19756 27.63187 37.22034 31.10551 57.75047 13.88869 21.22555 26.00036 26.92025 16.63907 14.92341 46.70997 18.40775 15.07982 39.35909 115.7332 15.58835 17.41824 32.12746 43.5377 21.73844 15.51384 14.42901 17.9022 25.14636 15.52416 30.86365 15.56371 20.90082 15.62087 16.0855 14.10205 27.75811 19.59732 19.19589 15.06951 22.23838 15.77319 17.10844 18.21673 66.07191 40.12327 14.71937 21.32319 14.44314 14.39882 

As expected, most of our movies are low budget, low revenue so they won’t be really popular. What if we try this again on our “eligible movie” subset?

outlierKD(movies[movies$revenue >= 30000,], popularity)
Outliers identified: 444 
Propotion (%) of outliers: 14.2 
Mean of the outliers: 36.77 
Mean without removing outliers: 12.41 
Mean if we remove outliers: 8.95 
Outlier Values:  45.4212 55.48254 32.08468 24.07623 29.53784 44.26686 24.79164 24.04838 26.5113 48.89694 41.82428 42.07346 37.4014 26.91715 30.7721 33.76535 27.46152 54.84676 28.40806 30.00502 40.42585 26.30396 24.08487 31.12644 27.64587 46.63636 28.53599 41.21242 39.34261 24.45711 31.76968 27.13343 23.31146 29.97866 26.58967 31.36713 23.71586 43.82052 33.1336 34.23371 31.25682 35.42325 23.86731 24.75804 23.96583 38.6996 23.19339 23.49795 25.20518 31.40147 24.49421 45.24956 31.84055 24.89992 28.47011 40.07116 23.18314 25.76593 27.78542 27.40628 31.04089 27.77376 23.97235 25.14245 36.38704 33.68249 35.41466 26.0193 23.90832 32.39943 23.20461 32.66604 24.31024 24.15223 27.21287 23.43819 25.01988 28.04252 28.20487 25.17875 25.2998 26.44543 34.27 44.99644 24.78165 43.50296 44.53939 24.26635 23.64886 23.28421 28.62251 33.94891 23.51322 24.71694 28.74014 34.87166 28.29228 31.14628 24.13297 26.64132 23.75927 24.16638 25.76446 23.61759 24.48574 29.38496 28.35882 23.58393 30.07628 26.89371 24.37673 25.89579 23.84082 24.03361 24.01532 23.41099 37.10988 27.32045 25.54164 26.53097 24.41916 24.60122 51.19131 24.95744 26.719 28.2999 27.12731 28.86811 23.22081 25.40604 31.33501 24.57173 37.11344 26.2569 42.4951 27.69471 43.24694 35.14194 62.95955 25.61573 28.99943 24.40487 34.40367 29.20339 23.59008 24.45558 25.0105 24.47424 30.50649 23.90517 23.28783 27.65587 38.39173 23.53161 38.6964 24.61483 35.71407 25.6296 40.71564 23.27727 29.54751 24.16063 24.98002 50.09157 46.72746 25.19019 24.19929 25.90399 24.7193 29.98049 25.25736 26.31578 24.48667 24.95738 35.57916 107.327 23.06673 47.08882 29.10537 37.08414 23.9757 23.85106 33.48643 28.74467 27.79797 28.62307 23.63364 24.62174 41.00317 24.28637 29.77142 24.01449 27.5249 34.82761 28.43989 23.50127 28.24739 29.93678 23.95377 30.37712 24.97622 25.54723 27.30654 30.26882 28.21243 39.68854 28.81088 40.42125 30.85222 37.62032 24.76002 31.6989 37.46091 25.42681 25.37998 24.1618 24.99456 31.30457 37.86154 24.22653 31.37263 25.20303 24.41796 34.25582 27.65887 28.29707 28.09138 26.98148 34.31598 23.2341 27.28881 29.47801 23.98655 25.20376 25.75208 27.68866 42.30338 47.5233 31.35913 38.91619 23.40949 31.97977 25.55846 27.76231 25.64139 27.20696 23.82761 32.93639 23.66778 30.74987 28.76826 66.13014 55.5443 43.18953 25.42356 31.00384 27.29185 31.75107 26.79854 31.54297 55.91552 24.41621 26.98423 28.86706 66.48552 27.33438 29.05327 40.60927 38.25019 24.66336 30.28256 29.10193 62.31726 65.77324 34.76349 26.54259 38.36515 43.87715 42.13061 25.86208 26.12996 25.22079 25.65522 25.45739 24.87513 47.6312 31.84388 30.1109 96.89646 57.31233 26.12151 27.04867 65.97805 25.40502 35.33159 27.25303 30.80578 51.52299 72.76859 28.15231 23.91057 37.56307 24.65144 26.80144 31.50901 27.77986 35.62877 50.59613 116.6297 32.53138 36.70854 51.86044 49.94384 29.68343 46.36093 42.74075 35.27964 47.04111 51.26118 38.79194 35.87392 41.41797 25.24941 251.8692 42.30351 36.28734 30.17396 23.70502 45.38329 47.61396 108.9423 30.48485 29.35774 48.81427 27.53663 28.35029 58.22907 60.15378 56.17762 25.07949 49.80317 23.71207 34.40547 24.01511 58.21653 37.64935 28.30984 25.74127 36.58096 46.13956 25.87761 104.9214 38.80084 28.91822 48.37825 24.3278 26.24433 24.54912 29.28597 46.2279 47.75424 31.63952 32.89079 49.83515 79.52384 26.67125 38.50226 32.32495 23.15276 394.2405 43.20568 55.55479 36.29867 27.2315 27.13595 23.19999 34.20732 51.33623 25.96344 31.11445 47.4758 33.51269 132.5188 31.62943 32.86125 24.16212 30.62538 35.15144 31.94974 26.72849 39.75791 30.30367 52.06355 33.64811 23.89903 37.20083 32.41491 34.52565 51.12014 40.97679 69.45881 27.4173 152.6255 38.94633 42.96498 23.95751 30.74502 25.42676 27.68713 25.47968 68.07303 24.47192 45.86121 24.06077 43.90694 23.19411 48.45644 28.7721 47.39973 54.62732 39.23174 30.53842 73.49327 43.83344 158.8831 299.6385 33.25289 53.8873 28.69394 38.91012 43.77365 27.63187 37.22034 31.10551 57.75047 26.92025 46.70997 39.35909 115.7332 32.12746 43.5377 27.75811 66.07191 40.12327 

Still a lot of 0s, but its much more centralized around 10 now. Again, this makes sense - runaway blockbusters aren’t necessarily the norm. Speaking of, what happens if we only look at movies with at least 10 million in revenue?

outlierKD(movies[movies$revenue >= 10000000,], popularity)
Outliers identified: 131 
Propotion (%) of outliers: 5.7 
Mean of the outliers: 58.48 
Mean without removing outliers: 15.25 
Mean if we remove outliers: 12.79 
Outlier Values:  45.4212 55.48254 44.26686 48.89694 41.82428 42.07346 37.4014 54.84676 40.42585 46.63636 41.21242 39.34261 43.82052 38.6996 45.24956 40.07116 44.99644 43.50296 44.53939 37.10988 51.19131 37.11344 42.4951 43.24694 62.95955 38.39173 38.6964 40.71564 50.09157 46.72746 107.327 47.08882 37.08414 41.00317 39.68854 40.42125 37.62032 37.46091 37.86154 42.30338 47.5233 38.91619 66.13014 55.5443 43.18953 55.91552 66.48552 40.60927 38.25019 62.31726 65.77324 38.36515 43.87715 42.13061 47.6312 96.89646 57.31233 65.97805 51.52299 72.76859 37.56307 50.59613 116.6297 36.70854 51.86044 49.94384 46.36093 42.74075 47.04111 51.26118 38.79194 41.41797 251.8692 42.30351 45.38329 47.61396 108.9423 48.81427 58.22907 60.15378 56.17762 49.80317 58.21653 37.64935 36.58096 46.13956 104.9214 38.80084 48.37825 46.2279 47.75424 49.83515 79.52384 38.50226 394.2405 43.20568 55.55479 51.33623 47.4758 132.5188 39.75791 52.06355 37.20083 51.12014 40.97679 69.45881 152.6255 38.94633 42.96498 68.07303 45.86121 43.90694 48.45644 47.39973 54.62732 39.23174 73.49327 43.83344 158.8831 299.6385 53.8873 38.91012 43.77365 37.22034 57.75047 46.70997 39.35909 115.7332 43.5377 66.07191 40.12327 

Still mostly centered around 10, and mostly normal looking after removing outliers, even if it has a long tail.

However, we can’t remove these outliers - most of them won Oscars after all, and that would throw off our classification attempts.

What about the number of votes that each movie recieved?

outlierKD(movies, num_votes)
Outliers identified: 3005 
Propotion (%) of outliers: 20.9 
Mean of the outliers: 1334.63 
Mean without removing outliers: 247.7 
Mean if we remove outliers: 20.56 
Outlier Values:  8083 8950 6535 953 3171 4915 6747 1066 338 2218 930 3335 3121 818 935 617 412 1493 5328 10763 9291 9884 5112 4719 2074 2439 14514 4725 2732 905 2310 3204 519 3371 1697 3439 1636 4279 586 1022 1534 1817 3223 521 554 827 276 3079 378 9166 3049 5945 2660 2488 292 193 446 4159 1109 1582 2042 640 2605 297 4256 2072 5222 1564 515 789 3680 979 2578 5152 3141 490 354 923 289 3892 753 282 1177 1988 271 751 668 2481 562 869 2953 194 826 6924 5633 4856 2305 2208 1233 2608 7680 2741 1453 600 3655 2569 2271 4240 3809 4014 904 1305 1198 2491 1822 5000 2539 346 3736 1264 2588 9260 7800 7764 7460 7316 2366 1861 3115 5693 7065 1007 2300 3906 238 369 5535 4133 3156 1260 1842 1848 264 1311 2239 1653 1609 291 5150 810 1362 3956 4271 2508 2022 225 205 5742 360 1355 456 1131 427 815 2248 717 675 257 321 915 1533 477 992 920 6145 1477 416 582 322 2894 1122 399 3439 553 4136 5568 1565 777 850 583 377 308 1763 2881 2058 259 1524 737 217 725 382 1846 251 538 1545 2516 918 2548 1579 1618 1681 2004 1322 3987 295 208 1170 2278 1452 520 668 398 1134 460 613 276 1218 624 428 4005 10971 585 331 2835 1773 1124 8736 510 330 246 550 203 1397 528 2781 1675 198 565 4982 6274 858 5306 5485 251 1416 886 276 399 2123 8026 2209 203 1438 2798 2754 337 276 1246 400 1111 355 3334 536 257 1706 1365 2740 1767 256 409 615 381 562 839 390 647 2067 530 873 4958 327 255 271 2505 5972 4911 671 360 462 369 533 389 341 798 365 322 264 554 653 841 391 1114 1475 269 1762 208 1572 468 1132 681 596 515 810 1082 268 345 426 291 635 2271 1312 4253 3389 3435 485 1928 383 641 1012 410 2036 1571 245 397 462 833 1800 222 1850 394 261 1381 444 1040 339 953 429 1685 267 227 2510 277 379 343 669 390 668 820 1490 1332 245 510 423 674 253 2711 807 210 2126 1742 729 1384 1139 213 1437 1303 1040 1034 1414 1911 613 537 400 332 213 1121 288 558 970 1023 289 393 199 2017 1123 1729 457 364 1680 683 637 249 254 555 2833 500 552 395 1344 292 681 480 372 4394 2665 1573 519 472 380 1568 824 559 1913 1398 210 1083 266 537 1021 1380 1446 1101 2065 333 343 267 547 1596 282 552 279 340 1857 4078 1010 1336 889 549 1219 696 844 514 795 1600 6448 412 860 442 1315 250 218 679 2223 241 286 1090 510 223 1420 2506 325 368 532 915 350 4026 2155 312 3015 460 648 992 240 641 522 648 1905 638 404 2950 2056 662 1381 534 848 2144 1779 1702 559 469 869 899 1789 259 852 655 1513 461 1857 817 283 1249 1584 1162 242 306 295 492 729 516 1470 565 553 677 214 1154 1101 1779 461 207 301 711 845 810 2353 264 1351 1520 743 681 639 402 759 1784 495 851 1206 488 856 3070 2599 3771 301 833 316 318 343 718 359 740 771 2223 585 218 1043 906 1243 337 289 564 5284 1543 1837 251 744 1182 640 228 850 331 376 192 259 340 368 3139 1157 956 872 658 3874 1937 221 4837 1283 245 201 423 382 213 192 382 792 346 471 1269 406 254 1255 1232 354 414 711 529 266 325 319 260 378 361 332 198 932 200 459 275 1288 195 1055 499 333 1203 416 994 644 1054 1329 2771 644 878 451 587 1350 646 872 564 824 829 855 1302 842 1714 811 1669 1016 1174 1329 1185 1072 2008 1114 709 4211 1180 1918 618 1807 633 1455 730 405 2967 560 203 401 711 264 224 227 2199 710 427 1206 696 710 2339 920 299 328 581 629 383 278 212 202 2560 505 258 1147 230 455 621 601 502 3924 1648 196 334 571 677 431 1444 331 269 1043 250 679 505 272 530 939 430 218 272 4125 1017 6887 203 449 476 557 1885 1435 1429 519 378 991 428 651 261 798 309 470 291 193 216 732 1155 576 546 1703 471 764 423 360 702 299 224 502 282 285 215 1291 390 210 204 895 193 1835 435 217 366 1093 826 697 670 410 544 535 587 686 397 264 372 1193 779 914 202 200 296 373 1680 200 235 8525 801 2062 441 864 277 659 1303 361 207 320 1439 5258 2614 5934 8574 1474 222 1689 326 1311 2422 1159 888 477 370 1394 498 205 970 1551 1127 237 848 494 1220 899 206 518 226 1484 446 1128 2462 6928 430 2218 484 278 645 1099 306 902 365 293 3102 253 238 1358 615 702 214 245 673 7826 295 709 412 1300 271 501 233 635 340 522 261 3535 638 602 474 546 358 433 546 553 323 493 1645 419 192 227 198 379 240 724 291 324 636 501 844 949 483 470 710 237 4103 311 300 442 248 392 260 577 241 272 943 293 366 349 328 233 693 878 207 224 539 255 995 411 1967 481 866 1036 213 2702 1674 371 8568 442 442 473 579 556 209 574 410 568 957 236 861 297 731 952 285 750 624 328 371 372 447 194 515 1880 421 238 487 653 1205 1952 690 202 297 302 295 300 1319 703 498 404 639 2028 508 465 319 376 349 539 371 380 809 554 337 255 273 1227 255 208 345 204 1145 536 547 588 306 498 377 722 421 291 1122 1294 224 290 201 201 423 956 5956 2309 1327 287 568 499 658 419 615 1196 437 633 1535 198 703 271 445 3831 1204 414 1707 7324 7914 218 230 208 332 891 238 211 670 294 317 710 301 225 555 356 200 209 200 194 251 218 308 256 192 239 1246 439 749 2253 387 278 210 321 311 268 324 318 211 425 3600 387 353 194 259 768 255 4074 262 313 352 265 1171 202 609 864 259 1347 480 241 234 230 285 304 2834 861 443 217 5221 204 476 503 286 546 633 434 373 307 276 754 292 311 1280 331 275 265 586 416 563 319 484 2896 324 1067 1961 420 717 629 210 323 2296 274 256 239 541 198 680 289 200 362 371 377 8891 5879 660 310 483 387 428 210 193 544 204 1830 219 845 596 295 213 533 389 583 370 527 982 1342 2151 320 264 1536 527 1952 205 212 2298 370 241 215 273 260 272 244 1060 548 417 291 269 278 263 392 695 1216 1819 271 313 323 195 510 1539 716 678 256 259 515 267 916 432 426 234 708 8396 1307 269 631 1851 233 204 277 296 192 248 2295 419 2492 878 661 4184 245 1579 630 478 3384 2307 371 402 2703 579 627 1210 937 948 265 395 405 7761 2812 848 245 502 628 251 256 960 747 784 236 4528 1086 3889 354 1457 1109 14461 1042 219 7750 972 2685 3413 514 1813 369 1376 498 349 1353 1710 236 440 494 211 260 219 385 231 254 2786 277 2255 465 1897 1036 319 563 767 466 199 1995 797 469 466 1567 255 1490 2885 1714 901 655 955 1090 638 289 1834 1314 449 498 933 987 5715 800 484 2052 1422 376 613 497 281 1766 318 3211 224 288 359 724 686 417 1021 14163 342 326 405 552 760 245 624 348 355 788 295 248 344 551 413 252 298 605 361 1090 839 364 497 813 546 209 217 1988 16852 1117 2551 3552 577 1658 1280 213 224 332 193 2332 667 749 308 803 660 196 2104 402 749 2681 750 1295 495 473 340 533 625 673 343 2085 507 615 238 307 570 628 1454 596 1344 419 1283 1639 308 4689 1915 1568 4418 4350 1399 1044 657 232 744 817 506 370 3042 855 2222 8746 368 2873 553 4424 976 1918 420 331 214 340 832 1092 329 2011 2494 315 1113 559 839 506 230 478 605 596 871 394 3884 517 385 307 2311 1154 240 209 281 2147 213 547 816 4355 662 301 699 282 3427 1357 374 2267 3337 1616 651 441 379 427 331 575 1486 1588 4966 210 742 329 879 771 682 816 929 1014 1156 254 258 1488 275 308 1773 2227 961 236 243 755 653 303 528 2689 1700 1137 391 195 731 900 240 706 683 562 452 1070 1454 246 3272 269 276 5978 2055 721 358 640 292 363 287 2832 2495 259 319 2530 3122 1693 403 295 238 556 256 217 4681 3581 1814 349 3328 301 304 418 248 693 384 673 2683 415 267 371 2003 1190 662 1035 715 205 3088 3816 1843 1548 697 767 322 407 385 328 753 578 254 317 2725 413 2906 2362 578 830 393 10880 3011 7077 2269 9754 2492 510 1080 2901 914 7650 1507 995 1133 2581 4483 6238 1246 674 2443 277 2642 192 235 1111 398 424 1523 3006 2010 3448 3456 3218 494 207 493 260 339 335 660 454 316 205 390 3057 2903 415 407 880 1334 4705 374 353 282 2077 1164 2129 2950 269 390 464 5081 367 659 431 654 386 2049 214 1138 1125 578 504 306 4666 218 450 5698 1812 2882 1275 2122 380 3313 764 1010 266 1246 1290 270 828 334 209 4842 3818 419 1143 2749 1602 208 892 2789 772 486 1547 1654 1213 5492 424 578 205 3699 314 1723 474 375 673 1041 542 5524 350 318 5785 635 4536 3022 1190 1154 209 251 1412 1005 218 948 1029 871 615 220 2894 550 5041 915 1591 4900 880 4819 607 531 208 1168 1562 3049 480 202 341 453 378 12174 10493 923 4213 5940 1113 3991 1059 4108 2918 1165 445 558 498 305 417 547 11354 607 528 417 287 487 277 5978 577 1971 368 346 272 1464 1870 685 893 457 759 5902 1007 6780 447 550 1545 452 932 207 1394 3348 1670 858 2156 592 1764 262 542 1249 300 370 436 446 1115 569 1360 267 396 1791 384 5539 465 7143 486 294 3428 324 545 3387 4821 4758 2094 6562 11322 324 3245 2199 768 335 265 569 1420 1556 2376 3371 251 1435 964 259 6966 413 263 470 284 867 306 1319 642 199 1310 847 342 586 1281 728 1065 248 438 1052 207 237 1168 2775 2632 454 2351 639 493 295 2895 390 2579 196 839 786 304 707 2026 962 265 1290 286 3163 243 3202 2087 256 321 5483 5825 2365 343 3077 3847 1011 481 711 5869 430 3581 299 2163 487 392 959 568 501 200 281 951 326 236 536 250 677 352 471 3976 2433 866 205 747 208 413 1046 518 1030 2957 253 527 1539 1551 4287 2338 559 1152 304 367 2851 759 502 1002 455 673 6900 864 229 307 1767 973 211 1032 235 205 248 3733 1605 224 398 5602 321 410 611 1268 340 1231 2879 863 1530 2736 363 545 2068 1341 444 265 285 2035 695 268 3240 307 8758 1350 828 7306 8203 278 727 5269 5823 372 7596 297 690 380 1174 1257 321 2229 287 8627 785 850 2007 2210 849 880 2839 1455 1529 2987 2064 1803 3733 1088 6775 1170 1272 258 244 3552 511 389 224 857 223 1275 638 1022 233 2958 254 420 1365 1301 2047 3824 2216 3413 214 223 12443 1591 5510 357 5890 385 3627 319 465 1885 2723 6090 500 280 203 2081 263 792 3851 275 204 3610 486 5520 424 558 330 7492 197 412 769 374 7342 5314 1792 750 1377 240 314 1898 306 1893 1277 349 10448 1850 228 684 1839 1820 1332 225 966 1374 3718 6054 468 599 2203 2094 3800 3943 636 265 2071 878 9896 1528 440 4036 512 641 335 262 795 340 367 406 426 1016 233 1838 210 288 4112 621 663 539 264 2290 830 1058 891 454 403 209 8771 3125 223 661 3657 320 5374 728 635 987 799 1800 213 261 212 1275 978 423 3524 508 225 284 13667 5939 2750 487 271 603 1333 287 1322 353 414 469 295 342 409 658 478 1448 3155 3505 540 355 230 1926 1424 341 440 408 877 251 2838 4462 522 1488 217 271 430 5060 998 3481 261 207 548 1338 493 795 1018 791 466 1239 427 311 432 1390 394 338 607 353 303 563 7749 3861 205 529 450 195 960 1181 259 689 2410 4831 1822 592 553 266 232 438 2025 456 861 241 290 3986 662 1747 566 648 567 3274 346 5693 211 271 205 1038 428 251 257 972 265 312 435 1733 312 378 1821 1400 5718 3393 232 578 235 312 3806 301 1564 341 532 7540 571 197 211 370 196 2221 2071 959 727 2761 227 1939 325 362 1082 244 802 724 1616 1764 206 7449 301 1594 275 2524 5423 7697 354 2858 505 775 9110 256 401 325 389 383 298 987 7478 1251 239 6017 248 861 1409 310 772 260 3203 244 277 4560 947 301 477 582 335 225 853 405 250 4965 866 423 2988 2051 1295 2667 263 622 2081 349 582 687 2273 1932 301 1711 543 255 1126 399 704 848 4957 1786 862 611 271 1353 922 2799 239 1130 918 465 262 365 318 1263 232 545 197 270 204 364 700 321 1383 2511 3071 891 204 978 372 607 7613 280 649 1155 254 743 210 2365 1337 240 266 786 248 253 310 736 2421 339 1227 4295 370 463 820 395 1093 398 623 535 1349 674 490 313 280 396 344 5658 616 333 243 871 652 332 7206 294 254 420 501 451 6012 1039 331 420 221 1375 1830 1020 346 248 360 244 2129 368 209 432 354 502 494 733 203 426 221 2221 259 3870 322 1758 382 2536 719 253 719 351 957 3129 308 549 217 679 223 972 1144 2448 3119 217 1288 1147 1371 1258 3178 560 239 213 7774 2588 1508 541 2636 1481 1567 1349 216 1383 4850 2671 786 286 536 8638 232 1095 3700 319 6015 844 207 935 284 311 1072 760 351 710 461 1217 4438 254 971 203 1986 1394 335 374 783 6841 427 2431 1713 238 1653 9483 207 298 1397 216 799 1828 331 5604 463 671 3157 1020 1211 1979 1634 1200 2266 219 5426 337 214 222 1242 1659 264 315 258 1385 4634 1539 254 1497 3763 458 1315 837 3535 8116 3128 407 302 293 619 4424 601 765 564 7525 7998 5433 450 1419 240 421 627 253 244 324 1457 9062 876 2526 297 750 252 774 651 399 466 389 238 3042 660 314 2008 443 296 519 628 228 278 4519 1764 246 383 4220 484 598 455 14288 228 530 2689 458 663 4357 901 325 646 3070 518 214 1243 3760 3287 1463 711 219 1910 340 286 397 9912 8225 991 1830 442 2523 302 2406 1185 733 206 809 873 1284 608 537 692 1753 223 409 2104 2637 473 1345 825 587 1849 256 2361 223 649 2598 274 350 224 1778 1188 411 1292 794 250 201 997 617 1909 364 278 1365 794 316 1925 2587 254 1288 6816 885 923 3485 208 547 6828 593 3668 1139 1787 555 303 1794 772 767 3375 324 865 203 1510 268 7901 1993 1065 239 372 229 689 535 635 533 3915 292 2794 615 4663 238 2007 2834 1930 952 739 196 790 195 4118 3055 1346 273 650 1030 7435 239 238 6928 710 301 830 313 558 921 450 226 2031 308 284 250 658 3339 520 2836 486 476 372 578 2250 235 2173 2472 348 947 2993 3997 2155 362 350 484 392 1227 4762 670 1752 318 1076 4710 254 391 932 622 2933 523 2479 650 265 1689 297 2752 388 262 1383 496 458 2371 3175 653 526 2187 3219 481 1545 264 2176 493 565 7291 312 1857 2445 202 1183 296 476 748 354 500 856 434 3421 1798 340 763 251 204 192 3737 192 224 198 1743 283 194 2503 241 202 2747 344 562 493 867 242 503 533 856 1907 476 830 632 700 196 316 384 511 5738 257 687 563 1139 1787 1380 1017 2614 234 611 318 849 600 237 246 1806 3141 6211 910 621 299 280 793 890 1054 575 1803 246 430 262 1662 2673 1014 856 367 476 402 1078 274 2852 306 572 2050 1185 659 215 1195 1916 718 3305 518 635 779 1345 240 666 635 1148 236 553 192 917 335 1798 220 1656 428 247 214 205 218 308 921 750 426 1281 816 687 719 202 5124 755 210 322 223 330 426 340 391 416 389 1464 384 1086 444 308 563 238 

As expected, most movies are relatively unknown, so we have a lot of 0s. Changing our minimum won’t change this fact, just because of the way this distribution is skewed. And this kind of makes sense, only the really good or really bad movies get well known enough to warrent a bunch of votes, and there won’t be a lot of those.

Lets look at runtimes now:

outlierKD(movies, runtime)
Outliers identified: 2379 
Propotion (%) of outliers: 17.1 
Mean of the outliers: 61.26 
Mean without removing outliers: 88.22 
Mean if we remove outliers: 92.82 
Outlier Values:  143 151 178 179 201 152 145 187 140 169 138 143 150 178 139 149 138 164 156 154 141 146 163 152 161 141 157 138 183 153 144 144 147 143 167 141 143 140 151 147 154 144 139 140 152 180 144 142 140 145 138 157 175 140 139 154 150 170 34 167 167 141 141 160 145 139 144 166 157 148 139 182 165 30 158 165 170 150 150 148 157 138 138 152 147 139 145 146 138 143 11 8 138 153 152 184 140 138 158 172 141 141 141 185 150 160 146 5 5 11 5 163 172 28 8 138 139 4 5 4 7 183 145 167 175 158 147 16 224 41 30 35 155 170 141 38 152 166 25 214 180 142 26 5 138 153 170 178 41 5 214 153 28 28 160 208 178 140 162 170 140 146 138 140 40 141 30 144 155 220 30 159 168 164 185 9 143 139 5 5 150 192 4 30 140 12 165 22 148 41 27 154 140 185 143 45 152 180 40 139 180 156 22 239 35 210 150 141 147 155 204 161 141 7 36 25 420 41 30 30 144 141 148 280 145 230 30 175 32 18 143 146 200 144 153 30 12 154 140 8 7 152 22 145 154 233 44 41 8 30 6 44 38 156 12 172 255 23 23 338 25 139 13 155 151 150 149 155 44 142 149 138 45 14 148 37 7 11 180 43 34 41 13 21 152 3 3 165 169 24 143 141 146 40 44 21 180 179 140 10 140 40 180 180 33 44 138 39 30 30 45 147 150 30 4 5 4 10 210 158 4 23 17 30 30 7 160 160 38 142 141 181 161 15 149 146 16 40 10 40 139 141 38 38 200 143 45 140 166 205 30 6 45 3 44 164 41 140 26 33 37 33 30 150 2 30 41 176 143 173 15 158 42 40 190 151 159 26 43 28 188 143 144 180 165 161 43 8 142 40 22 6 178 185 161 174 42 31 10 32 36 41 138 4 149 12 1 540 10 37 145 42 375 300 139 9 5 213 45 171 33 155 18 208 202 35 40 21 10 6 15 30 145 45 155 44 30 45 42 6 149 42 173 13 43 40 18 22 30 151 21 30 540 18 24 192 37 41 7 160 6 157 140 232 6 13 172 7 140 156 150 21 164 5 35 9 23 150 43 282 160 43 139 40 517 300 12 7 138 26 17 6 178 185 15 22 20 144 165 22 16 33 27 18 40 30 41 237 42 145 140 157 40 161 26 3 13 141 38 146 41 142 143 11 20 4 6 29 5 3 180 33 189 13 168 140 36 45 45 45 30 4 255 240 45 45 5 40 40 40 45 45 13 6 8 4 210 4 28 45 187 147 148 138 19 28 144 45 194 1200 168 3 3 2 30 44 153 240 5 240 225 7 169 20 28 176 37 45 23 160 180 230 224 30 205 44 22 30 30 38 150 300 43 45 38 142 145 151 260 205 7 138 7 145 36 29 27 22 26 4 12 42 30 6 7 30 44 174 38 40 30 220 360 6 160 8 153 150 139 30 5 15 141 21 28 18 12 30 180 240 184 18 8 42 17 3 240 153 177 25 25 19 169 139 1 30 15 44 36 40 8 145 225 22 360 9 174 144 3 32 45 35 10 30 36 138 180 148 30 30 3 31 32 20 45 10 15 10 30 16 171 33 11 540 178 210 155 150 153 22 152 6 45 1 197 23 11 24 25 8 41 13 15 45 144 35 585 18 138 138 14 8 172 140 12 7 9 141 39 34 150 25 43 22 42 175 17 173 160 7 30 177 15 17 10 15 10 12 18 11 3 16 15 14 20 18 12 17 13 33 13 12 13 11 20 23 40 29 15 17 20 21 5 183 40 42 141 13 1 30 191 148 175 36 160 23 45 151 10 9 6 9 8 13 7 15 15 10 28 12 17 7 9 6 30 164 4 145 16 17 37 334 32 7 38 3 32 32 22 22 24 27 10 2 8 12 25 2 18 26 12 13 9 8 45 10 143 33 178 488 17 6 9 11 36 7 18 23 19 9 22 24 14 27 150 27 400 15 41 34 174 23 23 255 45 9 34 15 18 7 16 40 25 255 38 45 360 12 11 20 23 31 20 26 30 5 29 29 9 14 44 9 5 5 4 10 6 8 7 28 44 8 40 189 6 138 19 33 242 44 24 540 360 15 4 36 43 139 152 21 2 34 30 10 18 39 25 42 141 30 28 14 1 3 7 25 246 12 31 45 45 45 45 45 43 5 44 21 7 145 150 22 22 7 45 14 7 144 45 43 3 40 40 28 180 215 18 20 180 30 43 37 45 145 44 7 22 45 23 22 43 20 20 41 43 45 14 37 7 31 159 139 22 172 10 6 9 45 15 6 281 28 8 26 22 16 28 12 11 138 30 10 14 7 5 1 9 12 3 30 3 240 27 28 19 286 30 159 36 43 18 42 32 30 138 140 32 23 43 15 11 5 30 30 20 166 26 10 30 142 149 30 3 11 2 6 3 11 6 6 240 15 30 147 45 45 167 42 45 17 625 210 626 20 20 147 26 240 31 44 140 44 42 30 238 30 45 9 7 15 10 11 29 141 14 140 2 21 39 156 18 15 13 11 11 138 7 23 20 6 28 9 8 35 13 45 26 11 22 15 20 15 6 7 210 6 45 6 12 11 44 6 39 30 23 22 8 30 141 150 8 8 7 15 7 8 45 40 7 183 43 23 7 3 9 44 27 40 10 11 43 24 4 17 44 44 6 7 16 12 141 7 145 13 17 22 15 15 42 7 141 45 45 10 45 42 44 147 12 41 7 35 144 41 20 15 5 11 37 250 6 15 40 19 12 161 14 22 240 42 17 44 42 192 138 15 146 8 40 13 18 1 42 300 45 13 140 32 32 3 7 12 2 2 140 9 152 179 300 12 150 43 159 139 12 2 2 23 9 23 292 35 2 191 14 138 22 570 23 6 6 22 11 3 148 140 4 9 11 9 10 8 3 45 44 32 8 7 14 6 10 208 33 15 334 4 5 5 8 15 26 30 28 3 44 232 14 10 14 9 10 10 3 21 19 25 19 13 11 8 6 10 183 3 13 12 18 9 11 45 12 18 12 6 11 7 7 4 14 15 163 149 13 22 16 18 6 7 19 41 205 2 4 4 15 190 45 15 8 7 42 45 162 25 43 44 146 22 25 35 3 600 1 1 3 2 1 23 7 27 26 14 15 25 19 30 40 141 10 20 30 17 25 26 11 30 3 12 14 2 15 141 6 26 30 18 42 25 165 11 14 6 19 44 8 10 23 20 15 22 43 40 169 198 5 30 19 44 15 40 44 30 9 4 6 43 20 36 5 18 45 42 2 30 22 174 18 29 176 37 43 209 2 42 25 26 29 138 45 14 4 4 4 13 5 265 30 15 5 25 16 22 18 43 44 22 6 1 14 16 11 180 169 153 211 140 1 15 15 4 34 22 23 42 14 10 35 44 43 23 30 40 40 150 198 45 22 14 7 235 30 270 14 25 37 143 44 2 360 35 565 16 1 11 22 8 42 11 3 6 6 5 8 42 44 19 15 12 14 45 8 7 2 11 13 11 16 14 14 12 13 14 13 11 13 13 11 14 12 591 12 10 11 12 19 16 7 17 9 5 8 143 30 6 10 22 270 11 20 1 22 4 180 170 8 35 35 16 3 30 43 30 15 27 13 14 15 2 139 12 8 8 32 140 26 30 180 24 22 197 2 20 3 27 19 149 15 15 158 15 10 154 304 158 139 36 16 9 40 10 7 15 45 5 6 10 20 10 140 4 41 30 45 6 10 43 38 8 28 18 8 15 25 7 8 8 6 5 315 6 15 7 180 12 8 6 140 1 10 24 15 8 22 3 139 7 4 40 10 23 5 10 8 7 10 13 22 20 33 5 15 10 25 42 40 30 33 23 32 3 1 5 7 143 20 4 37 5 40 13 9 13 16 14 8 15 9 158 4 144 28 169 21 170 13 22 174 10 4 8 12 20 24 15 300 3 3 9 22 6 24 24 10 31 28 151 45 19 247 24 29 44 27 27 8 5 11 14 5 45 31 8 10 15 15 12 20 14 39 25 16 2 18 23 25 13 45 20 16 10 20 10 15 15 12 26 5 13 7 151 5 4 12 22 24 20 170 20 6 9 16 10 140 35 6 20 2 2 517 42 15 6 10 40 41 140 19 7 22 180 42 14 14 9 9 150 5 1 235 3 252 9 10 27 6 22 3 14 29 155 6 13 30 44 38 141 192 2 3 34 7 3 18 28 24 26 147 5 140 149 16 148 3 20 178 36 10 22 6 12 45 34 3 42 8 3 8 43 27 29 45 32 17 14 2 6 39 28 25 143 21 35 15 30 22 40 7 31 34 31 36 16 180 6 17 31 16 9 13 7 18 3 1 2 7 8 2 9 35 5 14 11 5 22 30 3 14 43 13 1 11 40 146 141 4 19 6 6 7 195 240 16 18 10 11 15 43 44 24 10 24 24 24 24 24 24 45 34 6 44 23 20 10 10 22 2 37 28 44 14 3 7 150 25 15 18 165 220 225 215 37 5 5 2 6 3 3 3 10 15 5 5 6 177 25 23 18 4 13 31 6 15 45 4 25 43 5 19 15 8 240 28 19 5 7 4 40 20 44 30 3 283 12 2 44 8 9 7 9 17 31 27 12 15 4 43 196 13 24 3 23 37 39 10 27 9 7 8 4 40 8 30 1 32 144 17 159 240 36 10 8 5 14 23 33 37 19 21 26 40 2 45 193 33 151 28 150 244 12 10 170 20 10 21 16 28 19 35 13 148 4 22 138 7 22 23 37 17 35 187 23 18 3 7 25 13 37 45 22 30 150 24 4 1 9 3 35 26 32 33 5 6 28 20 9 6 15 30 9 35 23 42 4 12 22 5 20 18 7 6 32 6 31 23 28 8 14 4 30 17 35 7 8 2 17 5 180 11 3 10 28 256 19 12 9 10 2 9 10 13 15 4 12 5 6 24 16 15 7 6 27 3 180 180 180 36 8 8 8 15 9 8 2 10 2 3 13 9 16 8 19 7 26 24 24 1 1 4 3 4 4 3 15 6 6 6 7 6 7 10 13 4 28 26 42 15 2 27 180 30 138 11 43 11 43 31 14 31 30 19 10 43 39 30 6 22 15 2 23 7 9 5 5 30 190 33 30 10 2 30 287 9 150 24 25 1 11 23 12 216 12 23 16 30 25 15 7 26 7 6 8 18 150 26 13 2 241 12 27 19 8 19 10 12 17 25 19 7 7 13 140 17 8 12 38 45 3 6 40 19 15 19 17 20 6 15 5 32 12 5 4 11 13 14 20 1 41 4 30 11 22 15 161 8 7 19 161 6 5 6 3 10 10 45 23 30 39 25 18 10 12 44 13 30 230 30 12 9 7 39 480 11 167 9 32 2 4 7 28 5 15 4 3 2 11 3 5 153 30 

So I hadn’t considered that there might be poor reporting even on the runtimes. Why is there a movie with 1200 minutes of runtime? (Note, that 1200 minute “movie” looks more like a back to back recap of some fighting tournament? The next closest is some indie flash-based animated movie. Someone made a 600 minute movie entirely in flash? Seriously, that number is correct. I checked.) Most of these, thankfully, are documentaries and concert videos that will end up getting removed through the revenue limits we will impose. However, we cannot get rid of outliers completely here, not while we are considering the marathon films that are The Lord of the Rings series.

Now, lets check the ratings distributions:

outlierKD(movies, average_rating)
Outliers identified: 0 
Propotion (%) of outliers: 0 
Mean of the outliers: NaN 
Mean without removing outliers: 4.52 
Mean if we remove outliers: 4.52 
Outlier Values:   

Would you look at that, its mostly normal! Of course, there are a lot of 0s and 10, but that comes from movies with very few votes - essentially movies that are so little known that all 10 viewers either hate the movie or love it.

One last thing we’ll look at is the distribution of the genres:

genredists <- c(sum(movies$action), sum(movies$adventure), sum(movies$animation), sum(movies$comedy), sum(movies$crime), sum(movies$documentary), sum(movies$drama), sum(movies$family), sum(movies$fantasy), sum(movies$history), sum(movies$horror), sum(movies$music), sum(movies$mystery), sum(movies$romance), sum(movies$thriller), sum(movies$scifi), sum(movies$war), sum(movies$western))
barplot(genredists, names.arg = c("action", "adventure", "animation", "comedy", "crime", "documentary", "drama", "family", "fantasy", "history", "horror","music", "mystery", "romance", "thriller", "scifi", "war", "western"))

genredists
 [1] 2449 1355 1127 4270 1253 2516 5254 1499  856  414 2372 1096  800 1667 3159 1162  242  123

So, most of these movies are dramas, comedies, thrillers, action, horror, or some combination of those. Good to know.

Now, lets look at the distribution of credits for the actors:

outlierKD(actors, movie_credits)
Outliers identified: 776 
Propotion (%) of outliers: 7.1 
Mean of the outliers: 91.91 
Mean without removing outliers: 19.81 
Mean if we remove outliers: 14.71 
Outlier Values:  103 94 74 67 101 92 138 104 113 78 93 88 65 74 76 248 157 190 164 100 126 91 75 92 65 92 87 89 78 150 77 74 91 143 84 105 122 89 78 75 84 83 112 112 79 70 96 71 133 80 67 121 90 65 92 124 107 75 92 128 128 100 93 65 72 96 133 110 94 78 70 69 126 65 97 108 96 66 82 80 85 71 66 113 137 65 133 71 110 66 107 87 111 78 69 75 79 68 101 124 82 103 77 66 125 67 74 66 72 75 92 88 71 80 84 71 69 107 82 65 88 107 117 170 80 71 82 86 128 67 65 71 87 71 119 77 83 85 65 79 77 68 226 111 75 74 73 74 146 112 78 77 117 100 130 81 116 91 82 99 85 131 126 89 84 75 64 72 173 123 97 82 96 72 65 67 105 121 119 114 158 73 71 88 70 64 75 65 80 104 69 112 70 92 86 64 79 107 73 148 174 123 69 97 93 76 73 90 86 70 89 81 103 104 64 84 111 128 68 118 127 100 99 88 68 84 69 73 92 79 64 115 104 91 71 70 138 118 96 70 86 124 83 98 105 88 81 65 77 83 80 95 82 96 80 92 90 73 75 65 73 118 82 69 77 64 98 77 98 66 84 74 67 101 84 127 164 93 64 91 101 86 72 77 120 94 66 69 80 81 79 99 88 64 83 96 126 75 104 64 66 72 121 65 88 85 73 65 78 78 79 109 83 228 85 68 92 90 74 72 71 71 119 74 89 65 77 68 68 129 93 66 74 77 78 78 69 115 65 77 104 78 68 68 107 70 68 68 80 88 117 88 98 132 83 68 142 71 96 74 98 105 72 91 86 82 73 78 83 77 64 65 182 78 77 78 68 81 77 75 90 66 69 95 82 65 72 129 96 138 64 80 78 73 70 85 102 66 97 158 86 84 100 118 106 90 73 77 125 110 158 84 75 64 95 92 128 76 84 174 104 73 67 70 64 73 72 99 67 86 70 89 68 81 131 130 64 81 74 97 84 157 64 73 75 196 85 82 69 66 80 71 83 87 102 155 64 76 83 133 104 67 85 66 109 75 71 97 96 109 78 91 86 98 79 126 87 65 71 67 81 108 101 69 76 98 93 106 65 94 90 81 115 72 133 66 66 85 71 103 115 138 115 84 262 74 65 92 66 65 66 66 127 103 64 83 87 64 67 78 191 85 70 69 131 66 98 78 79 66 74 128 87 97 69 120 65 82 80 192 196 69 102 74 66 70 68 68 81 96 74 64 64 84 78 70 66 75 78 77 119 91 104 64 166 118 67 89 82 123 96 65 65 107 86 116 274 77 103 81 83 105 94 74 90 71 89 67 83 80 73 93 76 80 102 76 111 73 72 99 68 101 82 79 172 145 95 71 82 91 64 211 67 93 65 69 80 79 77 78 78 86 71 66 82 67 65 71 69 83 64 90 111 82 90 73 87 74 78 135 81 123 76 238 110 81 90 72 71 72 65 94 67 69 70 80 69 97 71 87 161 122 283 71 106 170 280 109 74 67 105 65 93 68 135 126 66 79 65 76 64 157 65 72 92 66 121 175 113 78 94 104 72 68 83 68 96 124 78 64 86 85 110 141 77 68 64 135 209 81 69 117 123 81 72 80 72 68 102 84 137 101 69 119 100 64 72 170 110 99 113 92 92 89 130 68 106 92 65 69 84 174 73 142 131 80 64 86 104 87 80 66 64 126 77 251 73 104 98 85 140 72 76 99 70 74 97 83 98 79 78 69 88 84 103 64 

So I’d like to point out that the top two actors in terms of credits are Ron Jeremy and Evan stone. DON’T look them up, they are NSFW. Somehow, these actors must have gotten roles in non-adult films. Also of note, Ron Jeremy is more popular that Jackie Chan. Somehow.

Anyway, changing the minimum of our outlier check won’t do much here due to the shape of the distribution, and we can’t really remove outliers here anyway as most of the best actors have just tons of credits.

Looking at their popularity next:

outlierKD(actors, popularity)
Outliers identified: 1556 
Propotion (%) of outliers: 15.3 
Mean of the outliers: 4.85 
Mean without removing outliers: 0.9 
Mean if we remove outliers: 0.3 
Outlier Values:  4.293589 9.121019 12.687 6.50672 3.639945 2.794561 5.330714 4.420586 2.476459 3.887027 13.60515 9.105313 4.162614 6.042928 11.27456 5.510636 4.344071 5.284701 6.133499 12.50565 5.858802 11.37544 4.176092 5.513054 15.7801 3.975894 4.194573 4.933655 2.336736 12.43461 4.005463 7.981271 7.252904 17.28123 3.028522 8.15684 14.33822 6.788388 3.871074 5.932872 4.331758 7.150918 10.15581 8.574335 8.885031 2.930269 4.320137 4.033205 8.688135 12.79113 5.97161 4.437988 3.685737 4.638857 14.78706 8.138225 7.522049 4.818741 3.594175 4.821989 6.141907 2.541651 2.855035 3.805593 13.07778 2.718513 7.845103 5.804896 2.656646 4.689038 8.840721 3.719679 4.815211 2.383675 3.335559 8.358722 6.750317 11.91771 4.01325 5.184882 4.258428 8.233263 4.865802 3.695132 3.423616 5.709644 5.963741 3.581796 5.123727 2.813857 5.203092 8.439903 14.6104 5.735461 5.938789 7.792784 9.281485 5.122034 5.541439 12.7066 7.293491 3.338318 5.794631 2.405238 2.829592 19.67218 3.629516 6.003742 11.02658 2.728024 4.727374 3.787817 4.129601 2.632209 10.18593 8.700806 4.827688 4.740898 5.636233 2.697783 7.752885 5.246516 4.192826 3.148264 2.645818 5.08369 3.438439 3.128367 3.717528 3.904115 3.237833 3.606683 3.100906 3.379402 2.447904 7.464222 3.240215 10.31634 8.738212 4.268923 69.20541 3.281627 3.26488 2.882816 4.218651 11.22168 10.37454 3.260666 8.708432 6.923083 7.510058 2.959618 5.290016 5.36243 5.193512 6.649147 4.077456 3.214837 9.556108 5.979834 5.816929 19.03975 6.218267 10.38639 3.403983 6.634632 5.592247 4.266902 6.248348 5.833345 6.303812 3.012999 3.330957 2.942097 11.14375 2.768022 3.635061 3.118739 2.800231 3.339865 3.607619 3.527765 9.923797 4.138992 6.411395 11.25921 5.231999 3.734079 2.719369 2.890702 7.966657 7.92169 8.989747 3.223514 6.116704 2.855657 4.079132 5.045599 5.558788 17.98982 4.272283 2.492244 3.928552 10.28067 3.531369 6.017026 5.502844 8.032227 2.978819 3.55767 7.489422 6.38811 11.274 10.03171 9.315978 3.263428 4.206418 4.727177 10.7078 2.319098 2.762115 2.813737 8.708694 8.937929 4.524272 7.257404 4.058989 4.056045 2.904649 2.545536 2.803354 2.675495 2.810711 5.794773 5.355799 5.220756 3.535184 2.741633 4.587402 4.698305 3.092205 2.586766 4.166919 10.3927 2.923056 9.199284 3.884712 7.455734 10.22955 3.698911 3.65516 4.248608 4.292182 16.8926 3.790319 3.866142 3.659183 3.727121 3.434912 2.930691 7.964235 6.502791 2.605857 3.657308 9.468095 5.007306 6.258042 9.71347 4.262894 7.387078 4.518914 6.074626 3.235796 5.121131 2.673649 2.847461 3.975267 2.981675 3.635898 3.779127 2.77715 6.530121 2.375552 4.49115 3.245928 3.910554 4.021945 3.429986 6.315789 4.51435 7.155735 7.026656 3.109835 5.864414 2.428448 3.904899 2.482746 2.937379 6.505351 8.70487 4.786484 4.400123 3.796554 11.43832 6.178857 4.364541 10.99945 7.359139 7.682309 4.882638 6.102058 4.195171 2.56713 5.202738 7.898003 2.474229 2.66582 6.169266 5.661164 4.259498 14.15481 3.753545 4.443195 2.784225 14.93181 5.538413 2.332758 3.304944 11.11459 2.821875 3.362369 4.902709 3.400705 3.625942 6.739476 3.18478 2.614525 3.311426 3.052515 6.525117 4.129864 5.74044 7.969272 4.622528 2.778061 4.946173 2.660381 2.482121 18.74869 11.89547 3.829662 3.618129 6.474064 4.134013 9.364228 9.757987 6.73673 2.616958 2.678138 9.046926 5.882232 10.71359 7.735997 7.743185 5.433713 3.296808 6.743276 6.871584 3.226788 2.29922 3.363493 6.531179 3.075566 8.208088 9.489228 6.008588 2.851481 5.478866 6.24198 13.78592 4.834459 3.118151 5.039294 4.843969 7.233457 4.227247 2.785528 7.547868 8.337458 4.49006 6.717873 6.475339 5.126009 3.803383 4.82843 4.619212 6.160186 2.380519 6.913666 4.905163 10.10914 11.44434 19.29519 3.968585 2.333841 4.139977 4.835713 2.303423 3.774069 2.964036 10.9779 7.51869 3.239159 8.765633 3.463481 5.292868 3.05809 3.127554 4.484967 9.534022 6.666608 3.664908 2.47004 3.911067 10.65391 5.960793 7.256982 2.681911 3.015303 2.643847 4.477299 3.128725 8.050776 5.358143 4.43737 2.962277 2.324066 3.02449 8.93567 11.7743 4.095669 7.683867 5.838217 4.816903 2.544142 3.738643 6.182303 8.998671 6.270609 4.452678 3.067448 6.709809 3.682999 5.225552 3.826873 5.371515 3.938357 4.562009 4.733138 6.555202 6.436146 5.161533 8.251642 2.746972 3.068558 3.59322 2.744337 8.949131 2.771971 5.112659 3.256478 2.442413 2.682172 4.204678 3.853202 9.170394 6.899513 8.674799 2.831974 4.104392 3.75565 3.461072 2.765776 4.662431 8.165133 9.530481 6.036232 2.687705 6.99776 2.851615 4.480046 5.296184 3.609844 2.905841 2.316819 12.28139 6.928625 3.833058 7.797546 3.735956 10.85019 3.24668 4.708634 6.211846 3.958443 2.684422 4.907398 2.634464 5.81916 4.105745 3.593723 8.577251 7.045121 2.614902 2.556777 4.147962 2.435196 3.137665 5.325176 3.923343 4.375643 2.848019 2.628522 3.006464 6.168883 4.181914 3.877276 3.1279 4.438827 9.287087 4.977539 3.641367 3.362373 3.139458 14.22149 7.444195 4.487798 3.085839 3.273047 2.643807 4.341378 3.689861 3.457383 2.830085 5.111148 5.037448 19.51549 5.177493 2.988528 4.209426 2.50906 5.562539 2.571952 2.666721 2.367393 7.373602 3.705491 2.920014 3.724452 3.54122 4.913197 2.564652 2.752399 3.246911 2.619639 2.402704 3.133205 3.063539 3.059187 7.204746 2.610999 3.574855 8.612862 3.060701 4.416394 2.614114 2.357272 12.13493 4.546194 3.098015 3.418936 2.920763 8.180099 5.936339 9.736064 6.403865 18.31279 7.83454 2.635312 3.331588 3.120802 4.148001 4.188905 5.116776 2.934674 8.212377 3.821899 4.633044 4.365816 4.06527 4.180585 5.44204 3.121909 4.820551 9.293398 2.461144 3.381099 3.129909 3.244475 2.779281 7.785919 4.926342 3.100812 2.923109 3.005352 2.465158 8.29391 3.688087 4.125338 2.322302 6.370614 4.257366 2.955107 3.964775 3.60262 4.317666 2.612242 15.16573 4.575394 6.090976 3.230177 3.764529 3.39524 5.422845 2.508751 3.297398 5.740707 7.198635 3.197732 7.84218 4.187637 3.616428 5.573959 2.374191 2.944064 2.986766 4.21391 4.523123 6.807578 4.764512 5.899476 2.633807 3.171378 3.166685 2.382261 6.191787 2.55655 12.86529 9.426441 4.933214 12.26533 5.25511 2.629056 3.566815 4.704256 5.391963 7.252853 3.360746 3.060904 4.193234 4.775172 4.870673 4.623862 3.400544 2.51844 4.454277 9.131817 2.611522 5.746312 4.919662 4.718072 5.405515 5.480437 4.663473 4.646611 2.859048 2.911762 3.647081 3.57314 4.34722 3.464741 6.187152 4.576588 7.71903 4.22612 6.121429 5.050934 8.281615 2.761689 3.752815 2.447924 3.259245 5.830717 4.086938 3.127515 3.166376 8.347759 10.09487 4.134963 5.147035 10.27745 4.319923 5.234687 2.519523 10.76337 2.763571 6.735133 2.321799 4.554123 2.566563 2.937028 3.765674 8.234156 5.512035 26.08196 4.656906 3.126927 4.329905 4.244269 4.658425 5.719587 4.500013 6.368624 3.72853 3.728078 6.108858 5.212804 9.320999 4.590181 7.685858 2.721243 2.410029 4.136524 2.947597 10.16648 2.610153 3.341885 2.611 4.172173 2.862609 4.007508 4.938175 7.217185 3.563774 3.597567 3.301208 6.024043 2.745107 4.224002 3.328277 3.106666 3.700235 3.445695 4.584106 2.886086 3.321599 3.383136 10.52545 4.498834 3.94667 3.851544 3.018924 3.086113 8.642277 3.38952 6.671103 3.94749 8.024305 3.737579 12.4195 3.860917 4.634559 5.048619 2.513511 3.628519 2.767659 3.919699 2.524626 2.543493 3.749339 7.137735 3.974143 3.577998 6.144782 3.72804 11.44457 4.210175 3.237187 7.047695 6.000445 3.447941 5.649857 7.541397 4.644303 4.428773 4.016116 3.232429 5.936024 4.017402 2.379096 3.877147 3.80028 6.186802 3.622869 6.407159 3.011071 2.807195 3.091329 5.66455 3.99509 4.286156 7.627492 2.438808 3.858893 2.715037 12.83675 2.489753 4.186774 4.661865 3.062779 2.603221 3.234629 4.670018 7.214336 3.833977 4.293232 4.537666 2.921692 2.958606 2.618966 6.28683 10.78873 3.84648 5.547938 3.629914 2.38959 2.697521 2.707218 3.047023 2.883138 3.252227 5.496484 3.770284 2.374372 3.708961 2.392834 3.586888 2.809348 3.86177 4.326493 2.395186 2.54332 4.028471 2.857035 16.47036 2.858157 4.243886 2.35365 3.954206 3.110702 4.648375 3.850107 8.787447 5.698551 2.888446 2.410671 2.423489 3.091968 4.469132 4.612719 3.291247 2.327685 3.688241 4.228942 2.451746 2.963909 2.356284 3.247044 2.32104 4.681797 2.466299 4.293258 2.40129 5.324595 16.04709 6.498194 4.773639 2.615178 3.34013 3.494547 3.781397 4.542157 4.357434 4.715612 4.595873 3.9355 3.860019 8.199158 4.381747 3.401559 5.305674 3.708058 5.136593 3.154258 2.61418 3.400075 2.930126 7.770592 2.633437 2.930908 2.805447 2.569328 3.241261 6.051877 3.971496 3.431351 2.887652 3.952392 3.504737 2.602327 4.927239 3.681555 2.685269 5.669414 2.502689 3.084413 3.037371 2.772847 2.594111 3.876009 4.348022 3.22505 13.18536 5.938699 3.60127 7.667226 3.425506 18.56729 3.56712 3.107929 11.21199 6.89616 3.885372 2.966807 2.317826 6.8926 5.165931 4.349937 9.155957 2.420606 2.445589 3.729078 8.318394 2.737314 5.102069 5.000572 4.168864 4.047263 4.871418 3.42627 4.827836 4.064867 9.2846 2.314144 11.69668 7.13289 4.407295 5.135728 3.401477 2.405756 4.511551 3.233835 6.88094 4.883063 2.63832 2.815977 4.329982 4.175983 8.103379 3.064939 2.917706 14.60609 3.224719 2.691378 3.112577 2.633295 2.371312 17.70338 2.334585 4.922141 9.660956 4.320898 4.402346 7.599336 6.668357 4.262141 2.385109 3.671832 4.751322 3.600339 5.937483 5.664698 3.30796 3.16199 7.131729 2.619985 3.53351 2.561811 2.757091 2.69881 10.54979 14.91143 11.09513 7.893826 3.046599 2.72398 3.572087 6.171286 5.224719 2.42954 2.78324 10.43637 5.075132 2.888857 3.490965 5.839771 4.983203 5.738911 9.01306 2.560976 2.549361 3.938636 4.120813 2.45509 3.172982 2.872111 2.517197 2.597427 2.651952 2.678803 3.18834 3.24843 2.709986 3.90276 15.86469 2.664134 3.9503 4.628127 2.449348 3.620778 2.595775 5.297443 3.41552 3.658584 5.121102 3.234025 2.716903 4.173532 4.645518 6.875503 2.983182 2.612098 3.631085 3.930749 3.224434 5.801854 3.466166 3.662404 5.702917 3.786335 2.609432 6.464349 2.649452 6.844686 4.999175 4.149542 5.773174 5.567535 3.83697 2.729188 2.878362 6.228623 3.645168 4.186592 2.705504 4.498557 3.077738 5.938185 3.245904 3.398279 9.282999 3.442838 3.542304 4.185854 3.197979 8.643276 4.849722 2.569031 2.792457 8.571635 2.760745 2.853893 6.444246 2.671128 4.656292 2.353427 6.377189 2.650106 3.866353 2.806 7.803464 6.270963 7.107391 2.516885 5.089472 6.68466 3.436371 3.819511 3.616571 8.199476 3.343269 2.672364 3.189877 4.193441 3.517823 2.395338 6.695504 3.087476 6.691776 2.460552 3.485903 5.522559 4.075928 3.238805 2.567576 3.946475 3.373248 2.553445 4.691609 2.454484 5.234209 3.275464 2.71888 3.593229 4.543183 3.20538 5.63305 2.329711 2.560474 3.261292 2.302268 6.020323 4.369939 3.894261 4.297846 3.6081 4.498516 4.062748 3.856662 8.809261 4.944683 2.906335 3.65005 3.624219 7.179015 3.369785 4.159555 3.879306 19.56783 2.547235 2.439107 2.382092 2.533845 10.32204 3.08615 2.612356 2.559704 2.765169 9.290185 2.627831 2.833276 2.457069 4.144977 2.749953 3.846646 4.755201 3.493696 3.293379 3.133484 4.433593 4.352705 2.897147 2.745329 5.332413 6.188052 4.430429 2.664605 4.923039 2.876688 3.086139 3.724332 5.666376 3.257334 2.590055 3.132419 2.727713 3.624704 2.957441 3.455388 4.369455 3.296795 6.393587 3.491751 3.672421 2.353925 2.646278 3.905791 2.66716 10.17164 2.580542 2.354196 2.925697 4.575008 3.594007 3.094355 3.606343 4.508008 2.837398 2.819118 6.147475 4.080961 4.231656 7.12997 4.23878 5.239338 3.713027 5.3461 6.079782 5.277401 4.406957 4.458315 3.77253 4.867514 2.625095 2.696798 4.331505 8.747371 2.329534 13.57112 2.395464 2.643318 2.787026 4.251965 2.638827 4.155962 3.170053 3.112465 2.662884 2.456772 6.517857 6.649506 3.099456 5.059668 2.670158 2.304953 2.404353 3.204764 2.422476 3.701829 3.41698 2.395894 7.396444 4.986227 4.430766 2.798508 2.709374 4.636837 3.829523 5.952416 5.43038 3.047458 3.632153 4.204092 6.465081 2.424276 6.463292 3.438077 3.333029 3.253216 2.858639 3.556686 5.045062 3.050435 6.610805 2.44986 5.299148 3.900102 5.492614 2.344852 2.609588 2.969833 3.877105 4.991545 2.540499 3.330818 2.743386 2.565492 3.022166 4.369915 4.849954 7.87265 2.648113 3.968992 6.645276 2.946791 2.538779 2.708746 2.416034 2.756957 3.074861 3.582261 3.00267 6.621116 3.585065 4.69388 2.379623 4.193064 5.36111 6.408842 5.604469 2.586739 3.837012 4.065773 3.933636 5.057924 2.425315 2.476445 6.156282 2.384892 3.469057 2.48991 5.149392 2.57451 2.792775 7.674862 7.807115 3.603858 8.551255 2.662482 4.396909 3.221484 3.378255 2.311036 2.485437 2.828736 5.752092 4.37673 2.42342 4.977743 4.570861 5.111685 3.079535 5.242597 4.423897 3.833071 4.205511 3.677161 2.545082 3.054463 6.69562 2.745824 2.67848 3.582698 3.423076 2.6478 3.646201 5.604628 2.696526 2.562763 3.67589 4.657923 3.61941 2.639816 3.511197 3.072321 4.093117 4.11913 3.904079 3.254908 2.737785 7.734008 4.21829 3.066993 2.629684 3.305602 3.275179 3.013679 2.468682 3.684292 5.56572 2.998505 2.927011 3.365576 2.764317 5.237526 4.879164 3.510375 2.55002 4.298386 2.352346 6.107181 5.781847 2.31026 4.912974 2.938916 2.419354 2.662123 2.430759 5.354259 6.27478 4.125393 2.766193 4.208891 2.619705 4.377906 6.180314 6.889165 5.240405 2.490384 2.341144 3.894854 2.452579 7.43623 2.622964 7.447111 3.060493 6.994997 3.333246 5.690154 4.496575 2.569827 11.14238 8.694883 5.225179 2.379331 2.899084 4.602902 4.397191 4.005312 8.041127 3.525402 3.135666 5.940137 4.958667 3.147249 3.088432 3.736209 22.84302 2.41424 3.063926 3.117094 3.319681 2.479632 2.754973 2.380882 4.185707 5.876011 2.315256 2.595453 4.127914 5.637659 2.298995 6.089166 3.615276 9.829559 3.054561 4.081698 2.597285 2.962744 2.411321 3.617906 4.3442 2.440806 2.53293 2.816246 2.526819 2.696303 2.819878 2.502031 3.706234 4.084086 3.792314 7.384123 2.466051 2.679972 2.615222 7.585938 2.756572 5.672388 2.684164 2.420719 3.702495 2.587664 4.365215 3.137393 4.57779 3.128889 3.93649 4.64666 2.370345 2.610342 3.288653 2.648152 2.818439 3.56699 2.828609 2.383646 2.723823 2.655864 8.949099 2.34694 3.741067 3.833992 2.464395 2.631207 2.447683 2.379185 2.964401 3.304995 4.392849 2.698602 10.30619 2.997557 6.344273 2.72137 3.111931 3.266082 3.300832 4.080029 3.261107 2.549845 2.922065 5.447216 6.026037 3.862658 3.045388 

This falls into the same boat as the credits check - can’t remove the outliers as the most popular actors are also the same ones in movies that win oscars.

We’ll do the same thing for directors, but it wont change much.

outlierKD(directors, movie_credits)
Outliers identified: 813 
Propotion (%) of outliers: 8.4 
Mean of the outliers: 46.17 
Mean without removing outliers: 9.3 
Mean if we remove outliers: 6.21 
Outlier Values:  98 39 68 30 68 138 31 71 72 48 31 81 47 31 58 49 59 33 27 31 38 158 43 41 65 32 55 59 99 39 82 30 50 30 78 55 42 30 35 52 104 48 28 51 29 34 61 71 77 29 74 73 115 56 69 34 38 27 39 52 33 31 93 107 29 32 30 612 46 29 26 35 45 46 32 36 162 124 30 31 32 77 71 39 27 52 25 26 55 35 84 44 43 28 27 41 31 55 52 32 39 45 35 25 44 93 34 77 29 59 38 91 39 37 37 43 110 40 38 43 25 92 50 50 44 75 25 45 25 31 26 30 27 141 36 27 35 45 30 33 34 32 29 35 26 58 108 51 28 132 72 26 31 32 41 54 34 39 25 41 29 31 33 92 35 53 51 46 30 34 30 107 28 31 27 32 52 79 52 26 30 39 35 35 78 55 41 28 28 86 56 64 44 35 34 25 29 35 25 31 33 305 25 39 25 36 54 38 60 37 30 25 28 44 29 63 36 28 62 29 59 52 35 41 44 46 32 29 34 27 26 40 73 32 67 29 99 26 28 33 32 27 38 33 26 32 26 35 45 46 28 39 95 49 37 37 64 25 25 45 27 236 47 28 31 49 49 37 26 56 31 34 26 69 31 31 32 45 74 55 27 25 25 25 39 40 31 27 25 40 55 34 29 73 36 51 103 28 45 26 26 139 42 67 30 37 29 39 36 29 28 43 38 114 28 41 44 30 50 252 40 48 57 25 35 71 27 25 79 57 25 35 29 51 29 26 36 30 54 30 35 31 30 43 44 60 99 90 31 52 51 40 56 51 43 54 38 31 59 30 33 40 38 71 59 33 38 38 32 32 54 27 27 46 60 49 79 31 37 43 26 50 30 34 27 28 43 32 37 26 28 37 35 29 27 36 29 48 27 31 34 56 38 44 29 42 34 45 28 52 35 52 53 97 48 27 28 34 29 25 26 26 31 45 29 37 39 33 32 27 44 29 26 33 32 29 88 38 43 38 34 44 38 31 28 54 28 31 37 27 25 46 74 40 39 25 28 41 31 38 25 28 54 72 25 25 41 25 102 63 43 27 67 34 49 34 25 37 27 35 57 76 35 25 26 29 33 75 38 26 48 32 27 25 27 38 30 109 28 26 38 28 35 45 55 25 38 148 35 46 96 29 26 43 32 31 40 30 95 26 25 33 45 27 49 26 29 79 25 29 98 25 44 26 34 105 57 80 35 40 25 64 42 50 50 26 31 34 25 44 28 44 55 47 51 63 30 26 25 48 26 36 49 25 33 41 41 32 41 30 31 48 44 67 51 25 29 42 25 44 78 96 32 54 27 25 33 49 26 31 35 29 50 63 25 229 25 39 32 53 42 33 31 46 174 30 43 59 38 36 34 32 84 34 69 42 27 53 55 81 33 31 100 34 40 27 62 164 42 93 61 88 31 26 40 31 31 64 29 25 35 53 32 46 47 29 29 36 39 32 111 27 25 142 31 35 32 27 48 43 28 103 25 37 106 59 32 26 169 28 96 31 25 39 54 36 36 37 32 78 29 31 36 75 27 30 25 31 99 26 58 35 41 29 34 31 34 25 44 26 32 35 43 32 30 50 25 26 25 40 26 28 42 43 32 25 91 31 39 56 38 32 30 49 36 27 27 39 38 44 27 327 42 50 29 33 40 26 32 35 28 37 30 33 58 41 25 101 33 25 46 29 120 42 69 34 30 30 26 132 43 52 28 36 48 28 338 25 51 74 37 76 27 104 32 34 28 30 50 52 34 26 31 41 28 37 28 28 25 26 29 33 25 33 26 65 32 44 26 53 25 25 25 77 51 30 25 38 28 44 26 28 27 

Again, good directors have a lot more credits - just think of Speilberg. Can’t remove outliers here.

outlierKD(directors, popularity)
Outliers identified: 1972 
Propotion (%) of outliers: 23.1 
Mean of the outliers: 1.19 
Mean without removing outliers: 0.23 
Mean if we remove outliers: 0.01 
Outlier Values:  4.693689 0.663795 3.257362 2.057021 2.30664 15.41436 2.623253 3.168493 3.828134 0.668892 2.236984 9.310951 4.146768 6.893863 2.439051 9.631775 2.169734 3.109493 1.267188 0.510009 3.124618 2.211915 0.498134 2.83328 1.377318 13.59698 0.470114 0.4 3.739502 3.209873 1.750869 11.08776 6.317091 3.373327 3.127406 5.126481 10.58563 6.455516 2.881907 2.41346 9.02374 6.255273 4.584135 2.237025 6.289017 1.635971 2.308395 0.711407 0.814058 2.422932 4.745042 1.309962 3.640351 11.14451 9.698837 1.051123 0.21992 9.516772 3.095116 6.004841 2.955891 1.641875 2.048979 3.185916 1.677972 8.030024 0.362067 1.426933 1.300755 2.065644 2.555996 3.162917 1.457761 1.797037 10.97151 0.65979 2.947083 0.335746 2.723189 2.085946 2.365297 5.76868 5.090438 2.051731 4.759183 0.388858 0.923322 7.541397 11.25044 8.012613 2.231227 2.625432 0.657693 1.049763 3.151851 3.17665 2.245029 4.249458 1.697339 1.823984 3.963512 4.469922 0.47236 0.673722 0.595803 4.98986 2.490031 2.157729 1.317149 4.961956 3.877321 4.125666 4.239024 0.730766 0.712868 0.329252 2.576655 5.468132 8.339582 1.831817 1.099476 1.033319 3.609705 0.658463 1.057315 5.744659 2.318939 0.125159 1.851613 2.320085 3.410961 0.714449 0.378524 1.312353 1.702829 1.50464 2.806808 10.62014 3.257176 1.481122 1.308042 5.226595 7.179536 4.335088 2.167812 0.444062 1.066172 8.991149 1.03874 8.660146 0.64 1.454565 8.204925 0.557164 0.59166 1.953315 1.701344 2.473726 3.999215 1.557037 2.14558 3.954729 1.8378 1.827734 1.585483 4.63976 4.080069 0.895126 0.595467 1.661823 2.397852 0.762222 2.612623 4.139481 1.865113 3.272457 7.56519 1.585821 1.115195 1.244375 1.061025 1.427292 8.794747 0.879815 10.29573 0.289467 5.870904 0.621421 1.908801 0.822492 0.600832 1.43511 6.642484 0.4 1.196282 0.459332 2.313615 0.674628 2.277572 1.850117 0.193638 0.342535 0.221119 2.210469 1.200793 1.493996 1.121188 0.476431 1.339637 7.593473 0.765672 0.75395 2.311187 0.787832 6.344803 0.412817 1.741177 0.494833 1.8566 1.763256 1.933197 2.615032 0.428859 2.224117 1.512878 0.660309 3.257876 1.655685 2.742588 0.174161 0.976325 0.449028 4.538469 1.1593 0.243324 1.082011 12.62411 1.67316 0.795972 0.653747 2.564554 2.378469 2.341431 0.590903 7.904207 0.534466 0.31983 1.211221 0.198647 1.39076 2.235586 0.629388 1.423128 0.247553 0.839335 7.810037 6.900418 1.57293 6.069907 3.188875 4.117793 6.836585 0.555359 1.135261 3.117835 0.688909 1.538559 1.610592 3.195933 1.878176 0.315017 0.795288 0.424066 0.140354 1.312846 5.194847 0.863297 3.18413 0.660064 0.698963 0.683826 3.549977 1.709949 3.822248 5.761641 1.656116 4.441132 0.671462 0.160383 3.170521 2.62481 0.284812 2.286714 3.954584 1.280839 1.743584 2.630768 8.553941 0.786786 3.486629 3.073433 3.531598 3.985274 1.382667 1.12 6.496864 2.394753 4.008154 5.128358 0.79674 0.484684 1.765252 11.58862 0.257712 1.42612 0.387197 1.066847 5.779903 3.201847 1.531752 1.69021 2.311337 0.684346 2.200536 0.376359 1.56 1.654902 0.560592 3.032836 0.30113 3.015002 1.530096 0.140175 1.667566 1.557193 0.470923 1.668302 1.048665 2.804968 2.696055 1.980635 1.800575 1.12191 4.364879 1.110144 2.162217 1.671925 3.008466 0.85367 0.33053 0.93126 1.146127 1.151702 1.752448 13.05082 1.135252 2.896152 1.836316 0.251959 2.552432 0.306454 5.342225 0.550759 0.647731 2.415489 0.4 0.56 0.174576 2.942323 1.636859 0.538536 0.792292 0.126958 3.286856 0.566246 1.315266 0.307464 2.451366 15.52425 0.125594 0.990783 4.191838 3.982386 2.319002 0.247128 1.718315 1.52724 2.704521 0.476727 0.323583 1.063209 1.24946 0.534634 0.143462 1.890997 0.253154 0.226051 0.173928 3.492481 0.4 1.430345 19.99998 1.500533 4.590442 3.56468 1.062444 0.704019 2.135646 0.684771 1.572066 0.656474 2.764775 0.326336 3.07067 0.779239 1.714114 3.735659 4.362924 2.894639 3.67264 3.739015 0.567323 1.445083 2.658188 1.901678 0.4 1.337342 2.287732 1.59963 6.512953 2.167984 0.350423 0.789363 1.164425 2.137504 1.610806 0.497329 1.281649 1.135536 0.528526 1.02656 1.994628 0.553941 0.483811 0.422782 10.90275 0.399841 5.964124 14.41067 2.093377 0.557832 2.324832 2.524253 3.580539 0.159386 0.960975 0.52 9.158525 1.041635 1.740095 2.067491 0.624705 1.127495 0.77622 1.020815 0.743117 2.448632 1.503354 1.538232 1.532114 1.704292 0.869755 4.856125 2.660246 1.501168 2.075853 2.862543 1.592576 0.175656 1.440947 1.886723 0.129208 0.126813 0.62504 0.601091 0.801361 1.005089 0.646614 0.415142 0.606732 1.266787 0.356663 1.530435 0.128506 0.439309 1.107135 1.551339 2.288947 12.59766 1.353352 2.659402 0.613641 0.162639 0.646076 0.560321 1.155299 1.495857 2.571271 3.18128 4.694218 2.061769 0.215663 0.257867 0.183613 0.782803 1.342245 2.049685 0.545685 2.152772 1.578331 2.840401 0.280083 1.05665 0.551949 1.566197 1.221149 2.629453 0.351947 1.196204 1.53277 0.689242 1.020608 1.205557 0.600822 0.4 1.996785 1.916026 2.144366 0.979215 1.874928 1.30655 1.926154 0.4 0.19167 0.581788 0.256551 0.908586 0.276059 1.113358 1.10689 0.519884 1.561667 1.245506 1.175392 0.82185 1.995012 0.367394 0.428218 0.699386 7.952825 0.575935 0.637429 0.4 1.273007 0.218732 0.14583 1.578266 0.64 3.3854 0.206251 1.057118 2.397023 0.271064 1.035015 1.859807 1.04 3.193194 1.231352 0.774299 8.182012 3.94163 1.009992 0.59508 0.247581 0.4 1.691522 1.756646 0.731601 4.222127 3.091656 2.701684 0.788907 0.510261 1.633646 0.344891 1.075583 0.64432 1.308206 1.82248 3.447424 0.611168 0.415722 3.789953 1.528497 0.36 1.14467 0.869142 1.12 2.454341 2.725383 1.111979 0.148778 0.867384 0.29589 2.99947 0.409699 0.718912 1.6 1.025113 0.270574 0.680638 0.743371 0.533974 0.615342 1.429288 9.500555 0.345372 2.198248 0.726857 0.56 0.677734 1.490546 1.216553 3.018137 2.332711 2.158439 0.694464 0.568 0.299585 0.211797 1.841147 2.374952 8.325782 2.220706 0.28317 0.298435 0.48 0.345744 0.606214 0.488306 0.161018 3.953403 0.379317 0.4 2.276822 0.480679 1.488752 1.796782 0.26665 1.014376 0.56 1.283574 1.194493 0.573242 0.190756 0.132749 1.818178 1.589588 1.597078 0.861903 0.349173 0.551713 0.592594 0.235542 0.613711 1.644537 2.06591 0.253074 0.846032 0.52 0.619301 1.115579 0.217764 2.973819 2.608052 0.953254 0.56 0.92581 0.4 1.418697 1.021364 0.786499 0.621574 2.796717 0.65981 0.492811 0.378842 1.469549 0.373708 0.914853 1.12 0.4 0.4 0.979619 0.64 0.286257 0.554362 2.267266 0.19999 1.033794 0.199788 0.728 1.272798 2.337568 0.8702 1.187166 0.4 0.56 0.584227 0.271064 2.939968 0.196655 0.4 0.610538 0.815842 1.266547 0.603009 0.454604 0.298477 0.428064 0.707762 0.633573 4.213118 0.7952 0.19656 3.567759 1.531882 0.565328 1.544498 0.198155 0.804026 0.4 0.512735 8.006164 0.307529 0.168 0.733872 0.62739 0.4 0.200519 3.762268 0.871014 1.222658 0.15867 3.26811 2.230579 2.25497 1.673167 0.4 1.803983 0.347577 0.308814 1.021936 0.683509 0.126659 3.129916 0.738308 1.306945 0.937013 0.562336 1.434805 0.915963 2.445491 0.155044 0.682301 1.311842 0.159727 1.241782 0.563143 0.186016 0.2352 0.498926 0.509864 1.186581 2.447045 0.134057 0.160248 0.306899 1.584321 1.034065 0.953496 0.821661 0.769986 1.863577 1.193453 2.703728 1.321816 0.889868 0.82005 0.32928 0.1884 0.289404 0.188344 0.518731 1.489771 0.187566 2.078865 0.568 0.519858 0.4 0.778484 0.461735 0.232744 1.15617 1.713164 0.801818 1.52222 1.023813 0.4 2.101612 0.162973 1.491027 1.206512 1.202009 1.112588 0.17112 2.447558 1.131908 0.57004 0.4 1.818435 1.135901 0.134754 8.803279 0.45446 0.989257 0.438434 0.233269 1.756004 0.734342 0.4 0.56 0.222732 0.975013 0.4 0.799826 1.53169 0.4 0.360032 0.475623 0.140536 1.436084 0.2352 0.57652 1.439914 1.232282 0.5512 2.047128 2.041739 0.170904 0.202104 5.030693 0.62867 0.771378 1.898291 0.239955 1.388372 0.542601 0.437248 1.250215 0.130113 0.32928 0.17939 0.227693 0.24 5.586932 0.759976 1.701636 0.300056 0.892286 0.191858 0.31892 1.212053 1.277119 1.117069 0.597101 0.52 0.162637 0.472086 0.486568 0.30576 1.984322 2.551474 0.838347 0.13104 0.359727 0.317538 1.657025 0.416235 0.720187 0.400296 0.714527 0.56 1.2 2.64751 0.16338 1.12 0.156 0.333639 3.147105 0.252286 0.201684 2.389747 0.22882 1.222956 0.460972 0.28398 0.22714 0.4 0.711957 0.36 0.503402 0.154206 1.598225 0.772674 0.167143 0.52 0.516378 1.551723 0.777959 0.656413 0.23059 0.24 0.226331 0.4 0.367191 2.129712 0.568 0.35028 0.4 0.460992 1.2 1.819874 0.4 0.522334 1.2 1.547546 2.155195 5.851594 0.240051 1.145516 1.06437 1.509067 0.200369 1.570775 0.326928 2.381376 1.556234 0.259728 0.8 0.213581 0.485169 1.642746 0.459929 0.4 0.1668 0.699832 0.85821 0.75792 0.721613 0.170687 0.460992 0.16728 0.197568 0.4 1.051015 0.184033 1.056838 0.760942 0.982037 0.4 0.24 2.612464 1.115095 0.4 0.87382 0.728 0.263344 0.250571 0.863087 0.144 0.348096 1.603752 0.942364 1.816437 0.482268 0.558594 0.52 0.168 1.543933 1.824406 1.480968 0.76 0.574127 1.2 0.645938 0.780142 1.021995 1.054246 1.253038 0.271064 0.423597 0.160859 0.203375 1.13544 1.048365 0.17004 0.326928 1.12 0.28224 0.56 1.276316 1.272149 1.205254 0.304252 0.64 0.4 1.034776 0.7056 0.168 0.735149 0.4 0.336 4.859251 0.51059 1.506051 1.596781 1.788401 0.138298 0.24 0.552141 0.64 0.139978 0.32928 1.085951 0.52 1.87074 0.764875 0.24 0.64 0.4 0.886731 0.4 0.358512 0.538298 0.181143 0.4211 0.362782 0.525254 0.235626 0.156 1.46124 0.156 0.4 0.193617 0.56 0.310719 0.2162 0.8 0.648459 0.1668 0.336 0.821691 0.2352 0.556 0.52 0.580878 0.460207 0.668117 0.4 0.24 0.8 0.4 0.32928 0.268949 0.628 0.1668 0.8 3.487364 0.4 0.1668 0.309625 0.52 0.269024 0.138298 0.4 1.543748 3.302132 0.302373 0.197568 0.32928 1.922626 0.168 0.562797 1.07916 0.4704 1.026259 0.56 0.493336 0.156 0.556 1.780467 0.168 0.191712 0.497694 0.376682 0.844173 0.841464 0.4 0.56 1.04 0.886928 0.221392 1.782542 1.04 1.183657 0.847209 0.224288 0.193311 1.500325 0.369264 0.156 0.32928 0.802592 0.52 0.542126 0.126284 0.156 0.4 4.672737 0.141546 0.329966 0.540112 0.175836 0.52 0.819672 2.709689 0.734429 0.4 1.494966 0.54112 0.728 0.336 0.77168 0.4 0.177284 0.64 0.24 0.52 0.490756 0.212874 1.148265 0.571234 0.513847 0.556 0.8 0.4 0.707556 0.4 0.4 0.682125 0.588111 0.365001 0.4 0.8 0.568 0.56 0.218156 0.76 0.51596 0.56 0.297966 0.4 0.578439 0.4 0.18139 0.8 1.259366 0.4 0.322308 0.14112 0.193299 0.32928 0.4 0.4 0.557063 0.226509 0.721499 0.4 0.168 0.30576 0.64 0.205353 0.4 0.52 0.2352 0.478191 0.909215 0.138298 7.50119 0.4 0.130988 0.451605 0.179306 0.664748 0.494973 0.530552 0.76 0.181152 0.156 0.64 0.862599 0.14112 0.4 0.446564 0.4 0.4 0.494607 0.52 1.224348 0.156 0.579705 0.359573 0.168 0.617803 1.260965 0.171984 0.168 0.161335 0.193706 0.156 0.14616 0.194852 0.156 0.8 0.8 0.52 0.8 0.71731 1.000748 0.21168 0.52 0.241851 0.52 0.8 0.342457 0.52 0.138298 0.634638 0.30576 0.792625 0.568499 0.643606 0.4 0.191262 0.556 0.641611 0.546423 0.52 0.380451 0.4 0.52 0.138298 0.275184 0.52 0.56 1.2 1.68 1.828002 0.4 0.4 3.208149 0.2688 0.7784 0.2184 0.794581 0.4 0.61152 0.568623 0.531206 0.138298 0.4 0.2352 0.2184 0.156 1.654003 0.56 0.168 0.556 0.781424 0.168 0.33199 0.4 0.156 0.4 2.113142 2.554204 0.168 0.151399 0.4 0.6352 0.24 0.156 0.52 0.4 0.4 0.29078 0.243981 0.828274 0.52 0.56 1.04 0.8 0.8 0.32928 0.4 0.2352 0.4 0.594111 0.4 0.4 0.144607 0.2184 3.104613 0.270745 0.4704 0.653473 0.192 0.420206 0.363619 0.168 0.4 0.8 0.90302 0.4 0.64 0.36 0.4 0.2184 0.4 0.168 0.502048 0.2184 0.52 0.57142 0.2352 0.4 0.54546 0.4 0.156 0.2184 0.64 0.4 0.376776 0.192 0.1884 0.483573 1.2 0.4 0.197774 0.556 0.183456 0.4 0.460992 1.058935 0.538298 0.276072 0.336 0.168 0.4 0.156 0.52 0.287052 0.52 0.2352 0.4 0.4 0.4 1.656813 0.4 0.197568 0.4 0.333984 0.2184 0.4 0.213846 0.4 0.2352 0.4 0.52 0.14112 0.8 1.108477 0.659728 0.2352 1.2 0.156 0.8 0.4 0.4 0.336 0.4 0.4 0.52 0.8 0.795701 0.4 0.4 2.877756 0.4 0.4 0.46704 0.4 0.4 0.32928 0.24 0.8 0.198277 0.2352 0.52 0.326928 0.4 0.24 0.52 0.32928 0.336 0.56 0.4 1.327282 0.56 0.556 0.168 0.168 0.56 0.271064 0.8 0.76 0.1668 1.12 0.728 0.156 0.156 0.8 0.192233 0.56 0.593617 0.4368 1.2 0.4 0.4 0.2184 0.24 0.2688 2.179708 1.059728 1.674443 0.912435 0.4 0.52 0.52 0.130109 0.4 1.568 0.4 0.8 0.190523 0.4 0.538873 0.4 0.168 0.30576 0.4 0.4 0.30576 0.4 0.4 0.312396 0.2352 0.8 0.4 0.137309 0.8 0.2688 1.279237 0.193617 0.52 0.52 0.64 0.4 0.507361 0.2352 0.91728 0.251702 0.156 0.1704 1.4336 0.4 0.56 1.087289 0.171304 0.4 0.460992 0.4 0.2352 0.763627 0.4 0.8 1.218994 0.168 0.259728 0.52 0.534495 0.8 0.4 0.168 0.56 0.5704 0.4 0.156 0.30576 1.716823 0.4 0.4 0.8 0.168 0.4 0.64 0.4 0.643929 0.56 0.52 0.298163 0.2352 0.4 0.2352 0.512896 0.30576 0.52 0.14112 0.168 0.2352 0.24 0.52 0.52 0.570464 1.01932 0.30576 0.646167 0.4 0.4 0.5776 0.4 0.52 0.4 0.4 0.2352 0.52 0.128419 0.168 0.138298 0.4 0.167558 0.125597 0.4 0.4 1.04 0.8 0.4 0.4 0.52 0.156 0.4 0.30576 0.567794 0.168 0.4 0.24 1.055384 0.4 0.4 0.4 0.4 0.52 0.52 0.8 0.52 0.8 0.30576 0.23352 0.85465 0.4 0.32928 0.13104 0.32928 0.4 0.591417 0.30576 0.363619 0.168 0.4 1.2 0.4 0.4 0.692377 0.64 0.2184 0.168 0.4 0.24 0.1668 0.4 0.4 0.4 0.52 0.4 0.2352 0.4 0.171304 0.168 0.52 0.4 0.2352 0.4 0.52 0.4 0.168 0.8 1.259 0.2352 0.4 0.168 0.4 0.428064 1.12 0.8 0.2352 0.64 0.56 0.76 0.568 0.289569 0.4 0.16816 0.4 0.64 0.628 0.4 0.24 0.4 0.162336 0.23352 0.52 0.168 0.52 0.8 0.4 0.4 0.4 0.4 0.168 0.17112 0.64 0.4 0.52 0.52 0.24 0.4 0.4 0.24 0.52 0.4 0.168 1.136218 0.428064 1.049069 0.4 0.2688 0.763922 0.620751 0.787842 0.645389 0.4 0.52 0.4 0.2352 1.0688 0.8 0.2184 0.24 0.156 0.37632 0.8 0.4 0.4 0.32928 0.52 0.52 0.52 0.4 0.168 0.8 1.413969 0.4 0.4 0.2352 1.2 0.168 0.4 0.556 0.24 1.121228 0.336 0.4 0.4 0.4 0.125283 0.4 0.52 0.4 0.13104 0.556 0.4 0.53104 0.2184 0.163208 0.168 0.52 0.30576 0.156 0.211656 0.52 0.36 0.52 0.4 0.52 0.156 0.4 0.4 0.52 0.168 0.326928 0.2352 0.56 0.1668 0.4 0.156 0.8 0.4 0.168 0.179787 0.64 0.4 0.8 0.24 0.4 0.4 0.128419 0.4 0.568557 0.4 0.4 0.127022 0.5668 0.156 0.4 0.56 0.5668 0.8 0.52 0.56 0.30576 0.192 0.52 0.2352 0.556 0.8 0.52 0.52 0.17004 0.568 0.52 0.32928 0.156 0.24 0.8 0.193617 0.8 1.2 0.4 0.4 0.4 0.4 0.4 0.2208 0.8 0.52 0.4 0.8 0.333984 0.326928 0.168 0.4 0.8 0.52 0.52 0.4 0.460992 0.8 0.4 0.2352 0.276314 0.4 0.4 1.04 0.4 0.1668 0.4 0.4 0.4 0.8 0.4 0.64 0.4 0.8 0.4 0.2352 0.4 0.52 0.4 0.4 0.1704 0.52 0.4 0.4 0.168 0.4 0.4 0.8 0.4 0.32928 0.52 0.52 1.16 0.4 0.1704 0.196577 0.572956 0.1704 0.4 0.4 0.4 0.4 0.4 1.2 0.13104 0.64 0.168 0.4 0.4 0.4 0.8 0.52 0.326928 0.4 0.52 0.4 0.4 0.4 0.4 0.52 0.8 0.4 0.2184 0.36 0.2688 0.52 0.24 0.4 0.2352 0.4 0.37632 0.4 0.4 0.4 0.4 0.138298 0.4 0.197568 0.6184 0.2184 0.269126 0.7952 0.53104 0.645389 0.4 0.460992 0.4 0.2352 0.742154 0.4 0.32928 0.1668 0.556 0.52 0.8 0.4 0.1512 0.57004 0.4 0.52 0.24 0.556 0.52 0.4 0.2184 0.8 0.8 0.4 0.4 0.8 0.56 0.6184 0.2352 0.4 0.4 0.4 0.4 0.52 0.8 0.5776 0.2688 0.64 0.52 0.138298 0.156 0.4 0.52 0.24 0.4 0.1668 0.8 0.4 0.52 0.4 0.4 0.8 0.156 0.24 0.4 0.4 0.32928 0.4 0.56 0.52 0.52 0.4 0.52 0.24 0.168 0.4 0.4 1.12 

I wasn’t really expecting this one to be so heavily skewed, nearly all of the numbers are 0. So everything is an outlier, really. Can’t remove them though, same reasoning as above.

Now, these next couple ones are only actors and that have won or been nominated for oscars, so outliers cannot be removed.

outlierKD(directoroscars, nominations)
Outliers identified: 17 
Propotion (%) of outliers: 7.9 
Mean of the outliers: 5.12 
Mean without removing outliers: 1.51 
Mean if we remove outliers: 1.23 
Outlier Values:  6 5 5 4 4 5 4 4 5 4 7 5 5 4 6 9 5 

outlierKD(directoroscars, wins)
Outliers identified: 3 
Propotion (%) of outliers: 1.3 
Mean of the outliers: 3.33 
Mean without removing outliers: 0.4 
Mean if we remove outliers: 0.37 
Outlier Values:  3 4 3 

outlierKD(actoroscars, nominations)
Outliers identified: 61 
Propotion (%) of outliers: 7 
Mean of the outliers: 5.38 
Mean without removing outliers: 1.45 
Mean if we remove outliers: 1.17 
Outlier Values:  5 4 4 4 4 4 4 4 6 6 5 7 4 4 6 9 6 5 4 5 6 5 5 4 6 4 4 4 8 5 4 5 6 6 4 4 4 5 8 9 9 8 6 7 4 4 5 6 4 4 4 4 4 5 4 4 18 6 6 4 6 

outlierKD(actoroscars, wins)
Outliers identified: 6 
Propotion (%) of outliers: 0.6 
Mean of the outliers: 3.17 
Mean without removing outliers: 0.38 
Mean if we remove outliers: 0.37 
Outlier Values:  3 3 3 4 3 3 

As expected, most values are really small, close to 0 or 1. There are a few standouts, but not many.

Now that we have a better understanding of our data, its time to compose everything together into a final analytical store.

Phase 3: Data Preparation

Data Cleaning

The first thing we’ll have to do is remove any rows where all 10 actors or all 3 directors are NAs. This is because these columns are nigh impossible to impute. So if we have absolutely 0 information, we really have no other choice but to remove them. Now, since we know that the scraper fills in actors and directors from 1 to n, then we can basically remove any row that has na for actor_1, director_1, or both.

movies <- movies[!(is.na(movies$actor_1) || is.na(movies$director_1)),]

Next, we’ll fill in the real budgets for those 23 movies that we looked up.

movies[movies$mid == 12689,]$budget <- 1000715
movies[movies$mid == 59296,]$budget <- 1200000
movies[movies$mid == 287524,]$budget <- 1100000
movies[movies$mid == 91551,]$budget <- 4701196
movies[movies$mid == 14424,]$budget <- 5000000
movies[movies$mid == 14055,]$budget <- 8287000
movies[movies$mid == 2196,]$budget <- 9000000
movies[movies$mid == 57585,]$budget <- 10000000
movies[movies$mid == 78383,]$budget <- 10000000
movies[movies$mid == 208869,]$budget <- 6151538
movies[movies$mid == 791,]$budget <- 18000000
movies[movies$mid == 11237,]$budget <- 25000000
movies[movies$mid == 21724,]$budget <- 25000000
movies[movies$mid == 6933,]$budget <- 27000000
movies[movies$mid == 1613,]$budget <- 27000000
movies[movies$mid == 204436,]$budget <- 33746302
movies[movies$mid == 11888,]$budget <- 35000000
movies[movies$mid == 50217,]$budget <- 93000
movies[movies$mid == 23988,]$budget <- 108000
movies[movies$mid == 58235,]$budget <- 200000
movies[movies$mid == 158752,]$budget <- 650000
movies[movies$mid == 14138,]$budget <- 700000

Now, we’ll remove rows based off the calculated limits from our exploration: $7000 budget and 50 vote minimum.

nrow(movies)
[1] 17385
movies <- movies[movies$budget >= 7000,]
movies <- movies[!(is.na(movies$budget)),]
movies <- movies[movies$num_votes >= 50,]
nrow(movies)
[1] 3300

So, we’ve learned that in about the last 16 years of cinema, there have been almost 10000 little known, low budget films that likely wouldn’t have gotten eligibility for an oscar. And thats even before the upcoming revenue check:

movies <- movies[movies$revenue >= 30000,]
movies

With that we lose another 1000 films, mostly independent, that wouldnt be eligible for oscars.

outlierKD(movies, runtime)
Outliers identified: 59 
Propotion (%) of outliers: 2.2 
Mean of the outliers: 169.32 
Mean without removing outliers: 108.83 
Mean if we remove outliers: 107.48 
Outlier Values:  178 179 201 187 169 178 164 156 154 163 161 157 183 167 154 157 175 154 170 167 160 166 157 165 158 165 170 157 172 160 163 183 158 214 162 170 165 156 161 154 338 165 169 161 158 165 161 157 172 164 165 157 180 169 159 167 156 163 174 

As we can see from the quick runtime check made above, this set of limits has also cut out most of those obscenely long or laughably short films - the shortest film listed now is 63 minutes, 20 minutes greater than the Academy’s 40 minute minimum to be considered a feature length film. By the way, this 63 minute movie is Winnie the Pooh, in case you were wondering.

Feature Engineering Now all that’s left is to add in a few engineered features - total actor credits, average actor popularity, total actor oscar nominations, total actor oscar wins, total director credits, average director popularity, total director oscar nominations, total director oscar wins, and the actual classification tab. Lets start with the actor details. Though, first, we need to get rid of just one more row - this movie has ids that are just garbage and dont exist anywhere.

movies <- movies[-c(876),]
totactcreds <- numeric()
avgactpop <- numeric()
totactnoms <- numeric()
totactwins <- numeric()
for (movie in c(1:nrow(movies))) {
  actorcredits <- ifelse(
    nrow(actors[actors$aid==movies$actor_1[movie],])>0,
    actors[actors$aid==movies$actor_1[movie],]$movie_credits,
    10
  )
  actsumpop <- ifelse(
    nrow(actors[actors$aid==movies$actor_1[movie],])>0,
    actors[actors$aid==movies$actor_1[movie],]$popularity,
    5
  )
  
  #only way I could enforce a sort of lazy evaluation...
  actnoms <- if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]) > 0){
    if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]$nominations))){
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]$nominations
    }
  } else{
    0
  }
  
  
  actwins <- ifelse(
    nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]) > 0 &&
      !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]$wins)),
    actoroscars[actoroscars$name == actors[actors$aid == movies$actor_1[movie],]$actor_name,]$wins,
    0) 
  
  if(!(is.na(movies$actor_2[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_2[movie],])>0,
    actors[actors$aid==movies$actor_2[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_2[movie],])>0,
    actors[actors$aid==movies$actor_2[movie],]$popularity,
    5
  )
  if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]) > 0){
    if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]$nominations))){
      actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]$nominations
    }
  }
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_2[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_2[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_3[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_3[movie],])>0,
    actors[actors$aid==movies$actor_3[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_3[movie],])>0,
    actors[actors$aid==movies$actor_3[movie],]$popularity,
    5
  )
    
  if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]) > 0){
    if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]$nominations))){
      actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]$nominations
    }
  }
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_3[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_3[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/2)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_4[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_4[movie],])>0,
    actors[actors$aid==movies$actor_4[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_4[movie],])>0,
    actors[actors$aid==movies$actor_4[movie],]$popularity,
    5
  )
    if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]$nominations
      }
    }
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_4[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_4[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/3)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_5[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_5[movie],])>0,
    actors[actors$aid==movies$actor_5[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_5[movie],])>0,
    actors[actors$aid==movies$actor_5[movie],]$popularity,
    5
  )
    if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]$nominations
      }
    }
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_5[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_5[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/4)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_6[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_6[movie],])>0,
    actors[actors$aid==movies$actor_6[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_6[movie],])>0,
    actors[actors$aid==movies$actor_6[movie],]$popularity,
    5
  )
    if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]$nominations
      }
    } 
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_6[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_6[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/5)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_7[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_7[movie],])>0,
    actors[actors$aid==movies$actor_7[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_7[movie],])>0,
    actors[actors$aid==movies$actor_7[movie],]$popularity,
    5
  )
    if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]$nominations
      }
    } 
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_7[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_7[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/6)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_8[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_8[movie],])>0,
    actors[actors$aid==movies$actor_8[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_8[movie],])>0,
    actors[actors$aid==movies$actor_8[movie],]$popularity,
    5
  )
     if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]$nominations
      }
    } 
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_8[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_8[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/7)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_9[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_9[movie],])>0,
    actors[actors$aid==movies$actor_9[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_9[movie],])>0,
    actors[actors$aid==movies$actor_9[movie],]$popularity,
    5
  )
     if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]$nominations
      }
    } 
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_9[movie],]$actor_name,]$wins,
      0) 
  } else if(is.na(movies$actor_9[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/8)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
  
  if(!(is.na(movies$actor_10[movie]))){
    actorcredits <- actorcredits + ifelse(
    nrow(actors[actors$aid==movies$actor_10[movie],])>0,
    actors[actors$aid==movies$actor_10[movie],]$movie_credits,
    10
  )
    actsumpop <- actsumpop + ifelse(
    nrow(actors[actors$aid==movies$actor_10[movie],])>0,
    actors[actors$aid==movies$actor_10[movie],]$popularity,
    5
  )
     if(nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]) > 0){
      if(!(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]$nominations))){
        actnoms <- actnoms + actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]$nominations
      }
    }  
    actwins <- actwins + ifelse(
      nrow(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]) > 0 &&
        !(is.na(actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]$wins)),
      actoroscars[actoroscars$name == actors[actors$aid == movies$actor_10[movie],]$actor_name,]$wins,
      0) 
    
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/10)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
  } else if(is.na(movies$actor_10[movie])){
    totactcreds <- c(totactcreds, actorcredits)
    avgactpop <- c(avgactpop, actsumpop/9)
    totactnoms <- c(totactnoms, actnoms)
    totactwins <- c(totactwins, actwins)
    next
  }
}

That was a huge loop…and we get to do it again for the director details as well:

totdircreds <- numeric()
avgdirpop <- numeric()
totdirnoms <- numeric()
totdirwins <- numeric()
for (movie in c(1:nrow(movies))) {
  directorcredits <-ifelse(nrow(directors[directors$did==movies$director_1[movie],])>0,
    directors[directors$did==movies$director_1[movie],]$movie_credits,
    5
  )
  dirsumpop <- ifelse(nrow(directors[directors$did==movies$director_1[movie],])>0,
    directors[directors$did==movies$director_1[movie],]$popularity,
    0
  )
  dirnoms <- ifelse(
    nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_1[movie],]$director_name,]) > 0,
    directoroscars[directoroscars$name == directors[directors$did == movies$director_1[movie],]$director_name,]$nominations,
    0)  
  dirwins <- ifelse(
    nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_1[movie],]$director_name,]) > 0,
    directoroscars[directoroscars$name == directors[directors$did == movies$director_1[movie],]$director_name,]$wins,
    0) 
  
  if(!(is.na(movies$director_2[movie]))){
    directorcredits <- directorcredits + ifelse(nrow(directors[directors$did==movies$director_2[movie],])>0,
    directors[directors$did==movies$director_2[movie],]$movie_credits,
    5
  )
    dirsumpop <- dirsumpop + ifelse(nrow(directors[directors$did==movies$director_2[movie],])>0,
    directors[directors$did==movies$director_2[movie],]$popularity,
    0
  )
    dirnoms <- dirnoms + ifelse(
      nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_2[movie],]$director_name,]) > 0,
      directoroscars[directoroscars$name == directors[directors$did == movies$director_2[movie],]$director_name,]$nominations,
      0)  
    dirwins <- dirwins + ifelse(
      nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_2[movie],]$director_name,]) > 0,
      directoroscars[directoroscars$name == directors[directors$did == movies$director_2[movie],]$director_name,]$wins,
      0)
  } else if(is.na(movies$director_2[movie])){
    totdircreds <- c(totdircreds, directorcredits)
    avgdirpop <- c(avgdirpop, dirsumpop)
    totdirnoms <- c(totdirnoms, dirnoms)
    totdirwins <- c(totdirwins, dirwins)
    next
  }
  
  if(!(is.na(movies$director_3[movie]))){
    directorcredits <- directorcredits + ifelse(nrow(directors[directors$did==movies$director_3[movie],])>0,
    directors[directors$did==movies$director_3[movie],]$movie_credits,
    5
  )
    dirsumpop <- dirsumpop + ifelse(nrow(directors[directors$did==movies$director_3[movie],])>0,
    directors[directors$did==movies$director_3[movie],]$popularity,
    0
  )
    dirnoms <- dirnoms + ifelse(
      nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_3[movie],]$director_name,]) > 0,
      directoroscars[directoroscars$name == directors[directors$did == movies$director_3[movie],]$director_name,]$nominations,
      0)  
    dirwins <- dirwins + ifelse(
      nrow(directoroscars[directoroscars$name == directors[directors$did == movies$director_3[movie],]$director_name,]) > 0,
      directoroscars[directoroscars$name == directors[directors$did == movies$director_3[movie],]$director_name,]$wins,
      0)
    
      totdircreds <- c(totdircreds, directorcredits)
      avgdirpop <- c(avgdirpop, dirsumpop/3)
      totdirnoms <- c(totdirnoms, dirnoms)
      totdirwins <- c(totdirwins, dirwins)
  } else if(is.na(movies$director_3[movie])){
    totdircreds <- c(totdircreds, directorcredits)
    avgdirpop <- c(avgdirpop, dirsumpop/2)
    totdirnoms <- c(totdirnoms, dirnoms)
    totdirwins <- c(totdirwins, dirwins)
    next
  }
}

And with that, we have our engineered features. Note that, due to a persistent issue with the scraper - not all of the actor ids were found in the database for some reason - we are defaulting any actors that couldn’t be found with 10 movie credit and 5 popularity, about the mean of each variable discovered from our data exploration. Lets add them on to our dataset:

movies$total_actor_credits <- totactcreds
movies$average_actor_popularity <- avgactpop
movies$actor_oscar_nominations <- totactnoms
movies$actor_oscar_wins <- totactwins
movies$total_director_credits <- totdircreds
movies$average_director_popularity <- avgdirpop
movies$director_oscar_nominations <- totdirnoms
movies$director_oscar_wins <- totdirwins

Almost Done! The last bit we have to do is tack on the classifier variables. Note that we have 3 categories here - not nominated, nominated, winner. For us, we are treating the nomination category as mutually exclusive with the winner category. This allows us to create dummy variables for this category - one for nominated, and one for winning. Thus, if both are 0, then the movie is not nominated for an oscar at all.

One more thing - Up and Toy Story 3 are a bit special. they’re the only animated movies in this dataset that were nominated for both animated feature AND best picture. So, we’ll duplicate those rows first, and when we run into them, we’ll handle them separately.

first, duplicating the rows. Up is row 1123, so lets duplicate it:

movies <- rbind(movies[c(1:1123),], movies[1123,], movies[c(1124:nrow(movies)),])

Next is Toy Story 3, which is row 778:

movies <- rbind(movies[c(1:778),], movies[778,], movies[c(779:nrow(movies)),])

now lets add in our categories and our classification variables:

category <- vector()
nominated <- numeric()
won <- numeric()
ts3 <- FALSE
up <- FALSE
for (m in c(1:nrow(movies))) {
  if(movies$title[m] == "Up" && up){
    next
  }
  if(movies$title[m] == "Toy Story 3" && ts3){
    next
  }
  if(nrow(movieoscars[movieoscars$movie == movies$title[m],]) > 0){
    category<- c(category, movieoscars[movieoscars$movie == movies$title[m],]$category)
    nominated <- c(nominated, movieoscars[movieoscars$movie == movies$title[m],]$nominee)
    won <- c(won, movieoscars[movieoscars$movie == movies$title[m],]$winner)
    if(movies$title[m] == "Up") up <- TRUE
    if(movies$title[m] == "Toy Story 3") ts3 <- TRUE
  }  else {
    if(movies$animation[m] == 1) category <- c(category, "ANIMATED FEATURE FILM")
    if(movies$animation[m] == 0) category <- c(category, "BEST PICTURE")
    nominated <- c(nominated, 0)
    won <- c(won, 0)
  }
}
movies$category <- category
movies$nominee <- nominated
movies$winner <- won

And with that, our analytics dataset is complete. Lets put it back into SQL so that the next guy (also me) can take a look at it and start modeling.

dbWriteTable(con,name = "moviesfinal", value = movies, row.names = FALSE)
[1] TRUE

All finished! Lets double check if that worked:

dbListTables(con) #sanity check - should show 7 names
[1] "actoroscars"    "actors"         "directoroscars" "directors"      "movieoscars"    "movies"         "moviesfinal"   

Now that we’re done, lets close this connection.

dbDisconnect(con)
[1] TRUE
setwd(currentwd)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojUGhhc2UgMjogRGF0YSB1bmRlcnN0YW5kaW5nDQpJZiB5b3UgYXJlIGxvb2tpbmcgYXQgdGhpcyBub3RlYm9vaywgdGhlbiB5b3UgaGF2ZSBhbHJlYWR5IGZpbmlzaGVkIHJ1bm5pbmcgYm90aCBzY3JhcGVycyBhbmQgdGhlIHNxbCBzY3JpcHQgdG8gcHV0IHRoaXMgZGF0YSBpbnRvIFNRTGl0ZS4gIElmIHlvdSBoYXZlbid0IGRvbmUgYW55IG9mIHRob3NlIHlldCwgZ28gZG8gdGhlbSBiZWZvcmUgdG91Y2hpbmcgdGhpcyBSIE5vdGVib29rLg0KDQoqRXhwbG9yaW5nIERhdGEqDQoNClRoZSBmaXJzdCBzdGVwIGhlcmUgaXMgdG8gaW1wb3J0IG91dCBtb3N0IGltcG9ydGFudCBsaWJyYXJpZXM6DQpgYGB7cn0NCmxpYnJhcnkoREJJKQ0KbGlicmFyeShSU1FMaXRlKQ0KYGBgDQpUaGVuLCBmb3Igc2ltcGxpY2l0eSBhbmQgZWFzZSBvZiBhY2Nlc3MsIHdlIHdpbGwgc2V0IG91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgZm9sZGVyIGluIHdoaWNoIHdlIGFyZSB3b3JraW5nLiAgSWYgeW91IGFyZSBhY3R1YWxseSBydW5uaW5nIHRoaXMgbm90ZWJvb2sgaW5zdGVhZCBvZiBqdXN0IGxvb2tpbmcgYXQgaXQsIHJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgbG9jYXRpb24gdG8gdGhlIG9uZSBvZiB5b3VyIGNob29zaW5nLg0KYGBge3J9DQpjdXJyZW50d2QgPC0gZ2V0d2QoKSAjc28gdGhhdCBJIGNhbiByZSBzZXQgbXkgd29ya2luZyBkaXJlY3RvcnkgYWZ0ZXIgSSdtIGRvbmUNCnNldHdkKCJDOi9Vc2Vycy9hdmczOC9Eb2N1bWVudHMvY29ybmVsbC9zcHJpbmcgMjAxOC9kcyA0MTAwL09zY2FyUHJlZGljdG9yIikNCmBgYA0KTm93IHRoYXQgYWxsIHRoZSBzZXR1cCBpcyBkb25lLCBsZXRzIGNvbm5lY3QgdG8gb3VyIGRhdGFiYXNlLg0KYGBge3J9DQpjb24gPC0gZGJDb25uZWN0KGRydj1SU1FMaXRlOjpTUUxpdGUoKSwgZGJuYW1lPSJtb3ZpZWRhdGEuZGIiKQ0KZGJMaXN0VGFibGVzKGNvbikgI3Nhbml0eSBjaGVjayAtIHNob3VsZCBzaG93IHNpeCBuYW1lcw0KYGBgDQpOb3csIEknbSBhIGJpdCBtb3JlIGNvbWZvcnRhYmxlIHB1dHRpbmcgaW5mb3JtYXRpb24gdG9nZXRoZXIgaGVyZSBpbiBSLCBhcyB0aGUgZGF0YXNldHMgdGhlbXNlbHZlcyBkb24ndCByZWFsbHkgaGF2ZSB0b28gbXVjaCBvdmVybGFwLCBzbyB3ZSB3aWxsIGRvIGZlYXR1cmUgZW5naW5lZXJpbmcgaGVyZSBiZWZvcmUgcHV0dGluZyB0aGUgZmluYWwgYW5hbHl0aWNhbCBkYXRhc3RvcmUgYmFjayBpbnRvIHRoZSBkYXRhYmFzZS4gIFdlJ2xsIHN0YXJ0IGJ5IHB1dHRpbmcgdGhlIHRhYmxlcyBpbnRvIGRhdGFmcmFtZXM6DQpgYGB7cn0NCmFjdG9ycyA8LSBkYkdldFF1ZXJ5KGNvbiwgInNlbGVjdCAqIGZyb20gYWN0b3JzIikNCmFjdG9yb3NjYXJzIDwtIGRiR2V0UXVlcnkoY29uLCAic2VsZWN0ICogZnJvbSBhY3Rvcm9zY2FycyIpDQpkaXJlY3RvcnMgPC0gZGJHZXRRdWVyeShjb24sICJzZWxlY3QgKiBmcm9tIGRpcmVjdG9ycyIpDQpkaXJlY3Rvcm9zY2FycyA8LSBkYkdldFF1ZXJ5KGNvbiwgInNlbGVjdCAqIGZyb20gZGlyZWN0b3Jvc2NhcnMiKQ0KbW92aWVzIDwtIGRiR2V0UXVlcnkoY29uLCAic2VsZWN0ICogZnJvbSBtb3ZpZXMiKQ0KbW92aWVvc2NhcnMgPC0gZGJHZXRRdWVyeShjb24sICJzZWxlY3QgKiBmcm9tIG1vdmllb3NjYXJzIikNCmBgYA0KV2l0aCB0aGF0LCBhbGwgb2Ygb3VyIHRhYmxlcyBhcmUgbm93IGxvYWRlZCBpbnRvIFIuIExldHMgdGFrZSBhIGxvb2sgYXQgdGhlbToNCmBgYHtyfQ0KYWN0b3JzDQpgYGANCmBgYHtyfQ0KYWN0b3Jvc2NhcnMNCmBgYA0KYGBge3J9DQpkaXJlY3RvcnMNCmBgYA0KDQpgYGB7cn0NCmRpcmVjdG9yb3NjYXJzDQpgYGANCmBgYHtyfQ0KbW92aWVzDQpgYGANCmBgYHtyfQ0KbW92aWVvc2NhcnMNCmBgYA0KTm90ZSB0aGF0IHRoZSBub21pbmF0aW9uIGFuZCB3aW5zIGZvciB0aGUgYWN0b3JzIGFuZCBkaXJlY3RvcnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAtIHdlIGNvdW50IHdpbnMgc2VwYXJhdGVseSBmcm9tIG5vbWluYXRpb25zLCBzbyBhbiBhY3RvciB3aXRoIDUgbm9taW5hdGlvbnMgYW5kIDIgb3NjYXIgd2lucyBoYXMgYXBwZWFyZWQgYXQgdGhlIE9zY2FycyA3IHRpbWVzLg0KDQpPdXIgZ29hbCBoZXJlIGlzIHRvIGFkZCBlbmdpbmVlcmVkIGZlYXR1cmVzIHRvIG91ciBtb3ZpZXMgdGFibGUgdG8gdHVybiBpdCBpbnRvIG91ciBmaW5hbCBhbmFseXRpY3Mgc3RvcmUuDQpBbm90aGVyIG5vdGUgLSBpbiBvdXIgbW92aWVzIHRhYmxlLCBhbnkgaWQgb2YgLTEgbWVhbnMgdGhhdCB0aGUgZGF0YSB3YXMgbm90IGZvdW5kIC0gc28sIHdlJ2xsIHN0YXJ0IGJ5IHR1cm5pbmcgLTFzIGludG8gTkFzLiBTaW1pbGFybHksIG1vdmllcyB3aWh0IDAgZm9yIHJ1bnRpbWUgYW5kIGJ1ZGdldCBqdXN0IGhhdmUgdGhvc2UgdmFsdWVzIG1pc3NpbmcgYXMgd2VsbCAoSSBtZWFuIHJlYWxseSwgYSBtb3ZpZSB0YWtpbmcgMCBtb25leSB0byBtYWtlPyBSdW5uaW5nIGZvciAwIG1pbnV0ZXM/KSBzbyB3ZSB3aWxsIGNoYW5nZSB0aG9zZSB2YWx1ZXMgaW50byBOQSBhbHNvLiAgV2UnbGwgbGVhdmUgcmV2ZW51ZSBhcyBpcyAtIGl0cyBwb3NzaWJsZSBmb3IgYSBtb3ZpZSB0byBtYWtlIDAgbW9uZXkgaWYgbm9ib2R5IHNlZXMgaXQsIG9yIGlmIGl0IGp1c3QgZ29lcyBzdHJhaWdodCB0byBUViAobGlrZSB0aGUgU3RhciBXYXJzIENocmlzdG1hcyBTcGVjaWFsKS4gDQpgYGB7cn0NCm1vdmllcyRidWRnZXRbbW92aWVzJGJ1ZGdldCA9PSAwXSA8LSBOQQ0KbW92aWVzJHJ1bnRpbWVbbW92aWVzJHJ1bnRpbWUgPT0gMF0gPC0gTkENCm1vdmllcyRhY3Rvcl8xW21vdmllcyRhY3Rvcl8xID09IC0xXSA8LSBOQQ0KbW92aWVzJGFjdG9yXzJbbW92aWVzJGFjdG9yXzIgPT0gLTFdIDwtIE5BDQptb3ZpZXMkYWN0b3JfM1ttb3ZpZXMkYWN0b3JfMyA9PSAtMV0gPC0gTkENCm1vdmllcyRhY3Rvcl80W21vdmllcyRhY3Rvcl80ID09IC0xXSA8LSBOQQ0KbW92aWVzJGFjdG9yXzVbbW92aWVzJGFjdG9yXzUgPT0gLTFdIDwtIE5BDQptb3ZpZXMkYWN0b3JfNlttb3ZpZXMkYWN0b3JfNiA9PSAtMV0gPC0gTkENCm1vdmllcyRhY3Rvcl83W21vdmllcyRhY3Rvcl83ID09IC0xXSA8LSBOQQ0KbW92aWVzJGFjdG9yXzhbbW92aWVzJGFjdG9yXzggPT0gLTFdIDwtIE5BDQptb3ZpZXMkYWN0b3JfOVttb3ZpZXMkYWN0b3JfOSA9PSAtMV0gPC0gTkENCm1vdmllcyRhY3Rvcl8xMFttb3ZpZXMkYWN0b3JfMTAgPT0gLTFdIDwtIE5BDQptb3ZpZXMkZGlyZWN0b3JfMVttb3ZpZXMkZGlyZWN0b3JfMSA9PSAtMV0gPC0gTkENCm1vdmllcyRkaXJlY3Rvcl8yW21vdmllcyRkaXJlY3Rvcl8yID09IC0xXSA8LSBOQQ0KbW92aWVzJGRpcmVjdG9yXzNbbW92aWVzJGRpcmVjdG9yXzMgPT0gLTFdIDwtIE5BDQptb3ZpZXMNCmBgYA0KDQpTbyBsZXRzIGxvb2sgdGhyb3VnaCB0aGlzIGRhdGEuICBUaGUgZmlyc3QgY29sdW1uIHRoYXQgY29tZXMgdG8gbWluZCBpcyB0aGUgYnVkZ2V0IGNvbHVtbi4NCg0KTGV0cyBzdGFydCBieSBhZGRpbmcgYW4gb2xkIHNjcmlwdCB0aGF0IEkgaGF2ZSB1c2VkIGJlZm9yZSB0byBydW4gb3V0bGllciBkZXRlY3Rpb24uDQpgYGB7cn0NCm91dGxpZXJLRCA8LSBmdW5jdGlvbihkdCwgdmFyKSB7DQogICAgICN0aGlzIGZpcnN0IHN0ZXAgYWxsb3dzIHVzIHRvIGdyYWIgYSB2YXJpYWJsZSBmcm9tIHdpdGhpbiBhIHNwZWNpZmljIGNvbnRleHQgLSBpbiB0aGlzIGNhc2UsDQogICAgICN0aGUgdWZmaSBkYXRhZnJhbWUuDQogICAgIHZhcl9uYW1lIDwtIGV2YWwoc3Vic3RpdHV0ZSh2YXIpLGV2YWwoZHQpKQ0KICAgICBuYTEgPC0gc3VtKGlzLm5hKHZhcl9uYW1lKSkNCiAgICAgbTEgPC0gbWVhbih2YXJfbmFtZSwgbmEucm0gPSBUKQ0KICAgICANCiAgICAgI2FsbG93cyB1cyB0byBzaG93IG11bHRpcGxlIGdyYXBocyBpbiB0aGUgc2FtZSBvdXRwdXQgd2luZG93DQogICAgIHBhcihtZnJvdz1jKDIsIDIpLCBvbWE9YygwLDAsMywwKSkNCiAgICAgYm94cGxvdCh2YXJfbmFtZSwgbWFpbj0iV2l0aCBvdXRsaWVycyIpDQogICAgIGhpc3QodmFyX25hbWUsIG1haW49IldpdGggb3V0bGllcnMiLCB4bGFiPU5BLCB5bGFiPU5BKQ0KICAgICANCiAgICAgI2JveHBsb3Quc3RhdHMgZ2l2ZXMgdGhlIG5lY2Vzc2FyeSBtZXRyaWNzIGZvciBib3hwbG90IGNvbnN0cnVjdGlvbg0KICAgICAjJG91dCBnaXZlcyB0aGUgY2FsY3VsYXRlZCBvdXRsaWVycyB1c2luZyB0aGVzZSBzdGF0cw0KICAgICBvdXRsaWVyIDwtIGJveHBsb3Quc3RhdHModmFyX25hbWUpJG91dA0KICAgICBtbyA8LSBtZWFuKG91dGxpZXIpDQogICAgIA0KICAgICAjcmVwbGFjZXMgdGhlIGVudHJpZXMgb2YgdGhlIGV4dHJhY3RlZCB2YXJpYWJsZSB3aXRoIE5BIGlmIHRoZXkgYXJlIGluIHRoZSBvdXRsaWVyIGxpc3QNCiAgICAgdmFyX25hbWUgPC0gaWZlbHNlKHZhcl9uYW1lICVpbiUgb3V0bGllciwgTkEsIHZhcl9uYW1lKQ0KICAgICBib3hwbG90KHZhcl9uYW1lLCBtYWluPSJXaXRob3V0IG91dGxpZXJzIikNCiAgICAgaGlzdCh2YXJfbmFtZSwgbWFpbj0iV2l0aG91dCBvdXRsaWVycyIsIHhsYWI9TkEsIHlsYWI9TkEpDQogICAgIHRpdGxlKCJPdXRsaWVyIENoZWNrIiwgb3V0ZXI9VFJVRSkNCiAgICAgbmEyIDwtIHN1bShpcy5uYSh2YXJfbmFtZSkpDQogICAgIGNhdCgiT3V0bGllcnMgaWRlbnRpZmllZDoiLCBuYTIgLSBuYTEsICJcbiIpDQogICAgIGNhdCgiUHJvcG90aW9uICglKSBvZiBvdXRsaWVyczoiLCByb3VuZCgobmEyIC0gbmExKSAvIHN1bSghaXMubmEodmFyX25hbWUpKSoxMDAsIDEpLCAiXG4iKQ0KICAgICBjYXQoIk1lYW4gb2YgdGhlIG91dGxpZXJzOiIsIHJvdW5kKG1vLCAyKSwgIlxuIikNCiAgICAgbTIgPC0gbWVhbih2YXJfbmFtZSwgbmEucm0gPSBUKQ0KICAgICBjYXQoIk1lYW4gd2l0aG91dCByZW1vdmluZyBvdXRsaWVyczoiLCByb3VuZChtMSwgMiksICJcbiIpDQogICAgIGNhdCgiTWVhbiBpZiB3ZSByZW1vdmUgb3V0bGllcnM6Iiwgcm91bmQobTIsIDIpLCAiXG4iKQ0KICAgICBjYXQoIk91dGxpZXIgVmFsdWVzOiAiLCBvdXRsaWVyLCAiXG4iKQ0KfQ0KYGBgDQoNCldpdGggdGhpcywgd2UgY2FuIGRvIGEgcXVpY2sgb3V0bGllciBjaGVjayBmb3IgdGhlIGJ1ZGdldCBjb2x1bW46DQpgYGB7cn0NCm91dGxpZXJLRChtb3ZpZXMsIGJ1ZGdldCkNCmBgYA0KU28sIGltbWVkaWF0ZWx5LCAsd2UgaGF2ZSBhIHByb2JsZW0gLSBhIEhVR0VMWSBkaXNwcm9wb3J0aW9uYXRlIGFtb3VudCBvZiBvdXIgZGF0YSBpcyBjZW50ZXJlZCBhcm91bmQgZXh0cmVtZWx5IGxvdyB2YWx1ZXMuICBTbyBtdWNoIHNvIHRoYXQgbW9zdCBvZiB0aGUgYmlnIEhvbGx5d29vZCBtb3ZpZXMgd2l0aCB0aGVpciBodW5kcmVkIG1pbGxpb24gZG9sbGFyIGJ1ZGdldHMgYXJlIGNvbnNpZGVyZWQgb3V0bGllcnMuDQoNCkFzIG11Y2ggYXMgdGhpcyBwcmVzZW50cyBhbiBpbnRlcmVzdGluZyBjb21tZW50YXJ5IG9uIHRoZSBzdGF0ZSBvZiBIb2xseXdvb2QsIHdlIHNpbXBseSBjYW5ub3QgaWdub3JlIGJpZyBidWRnZXQgbW92aWVzLCBzaW5jZSB0aG9zZSBhcmUgdXN1YWxseSBtb3JlIGxpa2VseSB0byB3aW4gQWNhZGVteSBBd2FyZHMgLSBzbyB3ZSBzaG91bGQgdHJ5IHRvIGxvb2sgc3BlY2lmaWNhbGx5IGF0IHRoZSBsb3cgY29zdCBtb3ZpZXMuICBGaXJzdCwgc2luY2Ugd2UgY2hhbmdlZCBhbGwgdGhlIDBzIHRvIE5BcywgbGV0cyBmaW5kIG91dCBob3cgbWFueSBvZiB0aG9zZSB3ZSByZWFsbHkgaGF2ZToNCmBgYHtyfQ0Kc3VtKGlzLm5hKG1vdmllcyRidWRnZXQpKS9ucm93KG1vdmllcykNCmBgYA0KV2VsbCwgbG9va3MgbGlrZSBtb3ZpZSBkYXRhIHJlcG9ydGluZyBpcyByZWFsbHkgYmFkLiAgSnVzdCBvdmVyIDcwJSBvZiBvdXIgbW92aWVzIGhhdmUgbm8gcmVwb3J0ZWQgYnVkZ2V0cy4gIElmIHdlIG1ha2UgdGhpcyBldmVuIG1vcmUgc3RyaW5nZW50LCBhbmQgb25seSBjb3VudCBtb3ZpZXMgd2l0aCBidWRnZXRzIG92ZXIgJDEwLDAwMCAod2hpY2ggc2hvdWxkIGJhcmVseSBjb3ZlciBlcXVpcG1lbnQgY29zdHMpOg0KYGBge3J9DQoobnJvdyhtb3ZpZXNbbW92aWVzJGJ1ZGdldCA8IDEwMDAwLF0pKS8gbnJvdyhtb3ZpZXMpDQpgYGANClNvLCA3MyUgb2Ygb3VyIGJ1ZGdldCBkYXRhIGlzIHJlYWxseSBzdXNwZWN0LiBTbyBsZXRzIGxvb2sgYXQgdGhlc2UgZmlsbXMgd2l0aCBiYWRseSByZXBvcnRlZCBidWRnZXRzOg0KYGBge3J9DQpiYWRidWRnZXRzIDwtIG1vdmllc1ttb3ZpZXMkYnVkZ2V0IDwgMTAwMDAgfCBpcy5uYShtb3ZpZXMkYnVkZ2V0KSxdDQpiYWRidWRnZXRzW29yZGVyKGJhZGJ1ZGdldHMkYnVkZ2V0KSxdDQpgYGANClJ1bm5pbmcgYSBxdWljayBnb29nbGUgc2VhcmNoIG9uIF9Bbmd1cywgVGhvbmdzIGFuZCBQZXJmZWN0IFNub2dnaW5nXyBzaG93cyB0aGF0IHRoaXMgbW92aWUgd2FzIHByb2R1Y2VkIGFuZCBzaG90IGluIHRoZSBVSywgaGFkIGEgdGhlYXRyaWNhbCByZWxlYXNlIGluIHRoZSBVSy4uLmFuZCB3ZW50IHN0cmFpZ2h0IHRvIGR2ZCBpbiB0aGUgVVNBLCBzbyBpdCdzIGRhdGEgaXMgcmVwb3J0ZWQgaW4gdGVybXMgb2YgcG91bmRzLCBub3QgZG9sbGFycy4gIEZ1cnRoZXJtb3JlLCB0aGlzIG1vdmllIGlzbid0IGV2ZW4gZWxpZ2libGUgZm9yIGFuIE9zY2FyIC0gVG8gYmUgZWxpZ2libGUgZm9yIGFuIEFjYWRlbXkgQXdhcmQsIHRoZSBmaWxtIG11c3QgYmUgc2hvd24gaW4gYXQgbGVhc3Qgb25lIHRoZWF0ZXIgaW4gdGhlIExvcyBBbmdlbGVzIGFyZWEuICBJdHMgbGlrZWx5IHRoYXQgdGhpcyBtb3ZpZSBpcyBub3QgdGhlIG9ubHkgc3VjaCBpbmVsaWdpYmxlIG1vdmllIGluIHRoaXMgZGF0YXNldC4NCg0KSXQncyBhbHNvIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBhIGxvdCBvZiB0aGUgZm9sbG93aW5nIG1vdmllcyBoYXZlIHZlcnkgbG93IHZvdGUgY291bnRzLiAgTGV0cyBzZWUgaWYgdGhpcyBob2xkcyB0cnVlIG92ZXIgbW9zdCBvZiB0aGVzZSBtb3ZpZXM6DQpgYGB7cn0NCmhpc3QoYmFkYnVkZ2V0cyRudW1fdm90ZXMsIGJyZWFrcyA9IDEwMCkNCmBgYA0KTW9zdCBvZiB0aGVzZSBtb3ZpZXMgaGF2ZSB2ZXJ5LCB2ZXJ5IGZldyB2b3Rlcy4gIElmIHdlIGxvb2sgb25seSBhdCB0aGF0IHJhbmdlIGJldHdlZW4gMCBhbmQgYWJvdXQgMzAwOg0KDQpgYGB7cn0NCmhpc3QoYmFkYnVkZ2V0cyRudW1fdm90ZXMsIGJyZWFrcyA9IDEwMCwgeGxpbSA9IGMoMCwzMDApKQ0KYGBgDQoNCkFuIG92ZXJ3aGVsbWluZyBtYWpvcml0eSBvZiB0aGVzZSBtb3ZpZXMgaGF2ZSBsZXNzIHRoYW4gNTAgdm90ZXMsIHNvIHdlIGNvdWxkIGZlYXNpYmx5IHVzZSB0aGlzIGFzIGEgbGltaXQgb24gb3VyIGRhdGEgdG8gdGFrZSBvdXQgdGhlIHdvcnN0IG9mIHRoZSBkYXRhLiAgUGx1cywgbW92aWVzIHRoYXQgYXJlIHNvIHBvb3JseSBrbm93biBhcmUgbGVzcyBsaWtlbHkgdG8gYmUgYWJsZSB0byBldmVuIHNhdGlzZnkgdGhhdCBlYXJsaWVyIGNvbmRpdGlvbiBtZW50aW9uZWQgYWJvdXQgT3NjYXIgZWxpZ2liaWxpdHksIHNvIHRoZXkgd291bGQgbmV2ZXIgYmUgY29uc2lkZXJlZCBmb3IgYW4gb3NjYXIgYW55d2F5LiAgT2YgY291cnNlLCBzb21lIGxvdy12b3RlIGZpbG1zIG1heSBoYXZlIGhhZCBsaW1pdGVkIHRoZWF0cmljYWwgcmVsZWFzZXMsIGJ1dCB3b3JkIG9mIG1vdXRoIHRlbmRzIHRvIGJlIGJpZyBzb3VyY2VzIG9mIGFkdmVydGlzaW5nIGZvciBzbWFsbGVyIGJ1ZGdldCBmaWxtcywgc28gYmFkIGZpbG1zIGFyZSBtb3JlIGxpa2VseSB0byBoYXZlIGZld2VyIHZvdGVzLCBhcyBwZW9wbGUgdGVuZCB0byBvbmx5IHRhbGsgYWJvdXQgZ29vZCBmaWxtcy4gIENvbnNpZGVyIF8xMDAgTWlsZSBSdWxlICgyMDA0KV8sIHdoaWNoIGhhcyAzIHZvdGVzLiAgVGhpcyBpc24ndCByZWFsbHkgYSBzbWFsbC10aW1lIGZpbG0gLSBpdHMgZGlyZWN0b3IsIEJyZW50IEh1ZmYsIGhhcyBhIHByZXR0eSBsb25nIGhpc3Rvcnkgb2YgZGlyZWN0aW5nIG1vdmllcywgYW5kIGl0cyBjYXN0IGlzIGtub3duIGZvciB3ZWxsIGtub3duIHdvcmtzIHN1Y2ggYXMgX1RoZSBOb3RlYm9va18sIF9MaXR0bGUgTmlja3lfLCBfUGxhbmVzLCBUcmFpbnMsIGFuZCBBdXRvbW9iaWxlc18sIF9Ib21lbGFuZF8sIF9GcmllbmRzXywgX0xhdyBhbmQgT3JkZXJfLCBhbmQgX0Rhd24gb2YgdGhlIERlYWRfLiAgVGhpcyBmaWxtIGhhcyAzIHZvdGVzLCB3aXRoIGFuIGF2ZXJhZ2UgcmF0aW5nIG9mIDMuMi4gIA0KDQpPbiB0aGUgb3RoZXIgaGFuZCB3ZSBhbHNvIGhhdmUgc2xlZXBlciBoaXRzIGxpa2UgX1ByaW1lciAoMjAwNClfLCB3aGljaCB3YXMgYSBzbWFsbCBpbmRlcGVuZGVudCBmaWxtIHdpdGggYSBidWRnZXQgb2YgJDcwMDAsIGhhZCBvbmx5IDIgdHJhaW5lZCBhY3RvcnMgaW4gYSBjYXN0IG9mIDcgcGVvcGxlLCBvbmUgb2Ygd2hvbSAoU2hhbmUgQ2FycnV0aCkgYWxzbyBkb3VibGVkIHVwIGFzIGRpcmVjdG9yLCBzY3JlZW53cml0ZXIsIGNvbXBvc2VyLCBQcm9kdWNlciwgYW5kIGVkaXRvci4gVGhpcyBmaWxtIGlzbid0IHdlbGwga25vd24sIGJ1dCBldmVuIHNvLCBpdCBoYXMgd29uIHNldmVyYWwgaW5kZXBlbmRlbnQgZmlsbSBhd2FyZHMsIGluY2x1ZGluZyB0aGUgR3JhbmQgSnVyeSBhd2FyZCBhdCBTdW5kYW5jZSwgd2hpY2ggaXMgbm8gc21hbGwgZmVhdC4gVGhpcyBmaWxtIGhhcyA3NyB2b3RlcyBhbmQgYW4gYXZlcmFnZSBzY29yZSBvZiA2LjguICBTbywgd2UgY2FuIHNheSB0aGF0IGl0cyBub3QgdGhlIG5hbWVzIG9mIHRoZSBjYXN0LCBidXQgdGhlIHF1YWxpdHkgb2YgdGhlIGZpbG0gdGhhdCBnZW5lcmF0ZXMgbW9yZSB2b3Rlcy4gDQoNClNvLCBsZXRzIHNlZSB3aGF0IHRoZSBkaXN0cmlidXRpb24gbG9va3MgbGlrZSBpZiB3ZSBvbmx5IGxvb2sgYXQgbW92aWVzIHdpdGggbW9yZSB0aGFuIDUwIHZvdGVzLjoNCmBgYHtyfQ0KYmFkYnVkZ2V0cyA8LSBiYWRidWRnZXRzW2JhZGJ1ZGdldHMkbnVtX3ZvdGVzID49NTAsXQ0KaGlzdChiYWRidWRnZXRzJG51bV92b3RlcywgYnJlYWtzID0gMTAwKQ0KYGBgDQpUaGUgbnVtYmVycyBoZXJlIGFyZSBtdWNoIG5pY2VyLCBldmVuIGlmIHRoZSBkaXN0cmlidXRpb24gaXMgc3RpbGwgaGVhdmlseSBza2V3ZWQuICBBbmQsIGlmIHdlIGxvb2sgYXQgdGhlIG51bWJlciBvZiBtb3ZpZXMgdGhhdCBoYXZlIGV4aXN0aW5nIGJ1ZGdldCB2YWx1ZXMgaW4gdGhpcyBsaXN0Og0KYGBge3J9DQpzdW0oIShpcy5uYShiYWRidWRnZXRzJGJ1ZGdldCkpKQ0Kc3VtKCEoaXMubmEoYmFkYnVkZ2V0cyRidWRnZXQpKSkvbnJvdyhiYWRidWRnZXRzKQ0KYmFkYnVkZ2V0c1tvcmRlcihiYWRidWRnZXRzJGJ1ZGdldCksXQ0KYGBgDQpUaGVyZSBhcmUgb25seSAyMyBmaWxtcyB0aGF0IGhhdmUgbm9uLU5BIHZhbHVlcyBmb3IgYnVkZ2V0cy4gIE9uIHRoZSBkb3duc2lkZSwgdGhpcyBtZWFucyBBTEwgb2YgdGhlIG90aGVycyBhcmUgTkEgLSBhbG1vc3QgOTklIG9mIHRoZSByZW1haW5pbmcgZGF0YSEgIE9uIHRoZSB1cHNpZGUsIHRob3VnaCwgaXRzIHJlYWxseSBlYXN5IHRvIGp1c3QgbG9vayB1cCB0aGUgMjMgbW92aWVzIGFuZCBzZWUgd2h5IHRoZWlyIG51bWJlcnMgYXJlIHNvIGxvdy4gDQoNCkl0IHR1cm5zIG91dCB0aGF0IG1vc3Qgb2YgdGhlc2UgYXJlIGNsZXJpY2FsIGVycm9ycyAtIGZvciBleGFtcGxlLCBhY2NvcmRpbmcgdG8gV2lraXBlZGlhLCBfQW5ndXMsIFRob25ncyBhbmQgUGVyZmVjdCBTbm9nZ2luZ18gbWFkZSBhYm91dCA3MDAsMDAwIHBvdW5kcyBpbiB0aGUgVUssIHdoaWNoIHRyYW5zbGF0ZXMgdG8ganVzdCB1bmRlciAxIG1pbGxpb24gZG9sbGFycy4gIF9Mb3ZlLCBXZWRkaW5nLCBNYXJyaWFnZV8gaGFkIGFuIGVzdGltYXRlZCBidWRnZXQgb2YgJDEuMiBtaWxsaW9uLiAgX0ZlYXIgQ2xpbmljXyBoYWQgYW4gZXN0aW1hdGVkIGJ1ZGdldCBvZiBcJDEuMSBtaWxsaW9uLCBfRGVhdGggb2YgYSBTdXBlcmhlcm9fIGhhZCBhIGJ1ZGdldCBvZiBcJDMuOCBtaWxsaW9uLCBldGMuICBJbiBmYWN0LCB0aGUgb25seSBtb3ZpZXMgdGhhdCBkb24ndCBmaXQgdGhpcyBwYXR0ZXJuIGFyZSBfUHJpbWVyXywgd2hpY2ggYWN0dWFsbHkgZGlkIGhhdmUgYSBidWRnZXQgb2YgXCQ3MDAwLCBfRXNjYXBlIGZyb20gVG9tb3Jyb3dfIHdoaWNoIGhhZCBhIGJ1ZGdldCBvZiBcJDY1MDAwMCwgX0JsYWNrIFdhdGVyXywgd2hpY2ggaGFkIGEgYnVkZ2V0IG9mIFwkNzAwMDAwLCBhbmQgX0Zyb20gUHJhZGEgdG8gTmFkYV8sIF9TdGFuIEhlbHNpbmdfLCBhbmQgX0NvbmZlc3Npb25zIG9mIGEgQnJhemlsaWFuIENhbGwgR2lybF8sIHdoaWNoIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBhbnkgb3RoZXIgc2l0ZSAoSU1EYiwgV2lraXBlZGlhLCBldGMpLiBMb29raW5nIGF0IHRoZSB2YWx1ZXMgZm9yIHRoZXNlIGxhc3QgdGhyZWUsIHdlIHNlZSB0aGF0IHRoZXJlIGlzIGEgYmlnIGp1bXAgLSBmcm9tIDM1IG9uIF9Tbm93IERvZ3NfIHRvIDkzIG9uIF9Gcm9tIFByYWRhIHRvIE5hZGFfLCBzbyBsZXRzIHNheSB0aGF0IHRoZXNlIGxhc3QgMyBtb3ZpZXMgZml0IGludG8gdGhlIHBhdHRlcm4gc2hvd24gYnkgX0VzY2FwZSBmcm9tIFRvbW9ycm93XyBhbmQgX0JsYWNrIFdhdGVyXywgc28gd2UgbXVsdGlwbHkgdGhlIGdpdmVuIHZhbHVlcyBieSAxMDAwLiAgU28gaWYgSSB3ZXJlIHRvIHN1Z2dlc3QgY3V0b2ZmcyBmb3IgdXNlZnVsIGRhdGEsIGJhc2VkIG9mZiBvZiB0aGUgZXhwbG9yYXRpb24gZG9uZSBzbyBmYXIsIEkgd291bGQgc2F5IG1vdmllcyBzaG91bGQgaGF2ZSBhdCBsZWFzdCA1MCB2b3RlcyBvbiBUTURCLCBhbmQgYSBidWRnZXQgb2YgYXQgbGVhc3QgNzAwMCB0byBiZSBpbiB0aGUgZXZlbnR1YWwgdHJhaW5pbmcvdGVzdGluZyBkYXRhLg0KDQoNCk5leHQsIHdlJ2xsIGxvb2sgYXQgdGhlIGRhdGEgZm9yIHJldmVudWVzIGZvciB0aGVzZSBtb3ZpZXMsIHN0YXJ0aW5nIGFnYWluIHdpdGggb3V0bGllcnMuDQpgYGB7cn0NCm91dGxpZXJLRChtb3ZpZXMsIHJldmVudWUpDQpgYGANCk9oIHdvdywgdGhpcyBpcyBldmVuIHdvcnNlIC0gc28gbXVjaCBvZiB0aGUgZGF0YSBpcyAwIHRoYXQgKkVWRVJZVEhJTkcgRUxTRSogaXMgY29uc2lkZXJlZCBhbiBvdXRsaWVyLg0KDQpTbywgbGV0cyBsb29rIGF0IGp1c3QgaG93IG1hbnkgMHMgd2UgaGF2ZS4NCmBgYHtyfQ0KbnJvdyhtb3ZpZXNbbW92aWVzJHJldmVudWUgPT0gMCxdKS9ucm93KG1vdmllcykNCmBgYA0KSnVzdCBvdmVyIDMvNHRocyBvZiBvdXIgZGF0YSBoYXMgbm8gcmVwb3J0ZWQgcmV2ZW51ZS4gV2UgY291bGQgdHJ5IHRvIGltcHV0ZSB0aGlzIGRhdGEgYnV0IHRoYXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2Ugd2hlbiA3OCUgb2YgaXQgaGFzIHRvIGJlIGltcHV0ZWQgLSBzaW5jZSB3ZSB3b3VsZCBoYXZlIHRvIGJ1aWxkIGEgbW9kZWwgdG8gdHJ5IGFuZCBmaWxsIGluIHRoZSB2YWx1ZXMgdGhlIGZpbmFsIGNvbGxpbmVhcml0eSBhbmFseXNpcyB3b3VsZCBzdWdnZXN0IHRoYXQgd2UgdGFrZSBvdXQgdGhlIHJldmVudWUgY29sdW1uIGFueXdheS4NCg0KQW5kIGZyYW5rbHksIHRoZXJlJ3MgYSBzbWFsbCBhcmd1bWVudCBmb3IgdGFraW5nIG91dCB0aGUgcmV2ZW51ZSBhbHRvZ2V0aGVyIGZyb20gdGhlIGFuYWx5c2lzIC0gdGFrZSBhIGxvb2sgYXQgdGhpcyBhcnRpY2xlOmh0dHBzOi8vd3d3LnRob3VnaHRjby5jb20vbG93ZXN0LWdyb3NzaW5nLWJlc3QtcGljdHVyZS13aW5uZXJzLTM4NzU2OTENCg0KX1RoZSBIdXJ0IExvY2tlcl8sIHdoaWNoIG1hZGUgYSB2ZXJ5IG1vZGVzdCAkMTcgbWlsbGlvbiwgIHdvbiBCZXN0IFBpY3R1cmUgb3ZlciBKYW1lcyBDYW1lcm9uJ3MgX0F2YXRhcl8gLSB0aGUgc2luZ2xlIGhpZ2hlc3QgZ3Jvc3NpbmcgbW92aWUgZXZlciBub21pbmF0ZWQgZm9yIGFuIE9zY2FyIGF0IFwkMi43ICpiaWxsaW9uKi4gIFNlcmlvdXNseSwgdGhpcyBtb3ZpZSBlYXJuZWQgYWxtb3N0ICoxNCB0aW1lcyogdGhlIHRvdGFsIGVhcm5pbmdzIG9mIF9UaGUgSHVydCBMb2NrZXJfIGluIGl0cyBvcGVuaW5nIHdlZWtlbmQgYWxvbmUuICANCg0KU29tZSBtb3JlIHJlc2VhcmNoIHJldmVhbHMgdGhhdCBtb3N0IG9mIHRoZSBiZXN0IHBpY3R1cmUgbm9taW5lZXMgZm9yIDIwMTggZGlkbid0IGV2ZW4gYnJlYWsgJDEwMCBtaWxsaW9uLiBTbyB3aXRoIGFsbCBvZiB0aGlzLCB3ZSBjb3VsZCBzYXkgdGhhdCB3ZSBzaG91bGQganVzdCByZW1vdmUgdGhlIGNvbHVtbiwgYnV0IHRoZXJlIGlzIG9uZSBwbGFjZSB0aGF0IHRoaXMgY29sdW1uIG1pZ2h0IGFjdHVhbGx5IGJlIHVzZWZ1bCAtIGRldGVybWluaW5nIGluZWxpZ2libGUgY2FuZGlkYXRlcyBmb3IgYW4gT3NjYXIuICBUaGVzZSBtb3ZpZXMgd291bGQgaGF2ZSBleHRyZW1lbHkgbG93IGVhcm5pbmdzIGNvbnNpc3RlbnQgd2l0aCBub3QgZ2V0dGluZyBldmVuIGEgbGltaXRlZCB0aGVhdHJpY2FsIHJlbGVhc2UuICBXZSBjb3VsZCBjaGVjayB0aGlzIGJ5LCBzYXkgdGFraW5nIGEgbG9vayBhdCBhbGwgbW92aWVzIHdpdGggZWFybmluZ3Mgb2YgbGVzcyB0aGFuLCBzYXksIFwkMzAsMDAwLiAgVGhpcyBudW1iZXIgaXNuJ3QgY29tcGxldGVseSBhcmJpdHJhcnksIEkgd2VudCB0aHJvdWdodCB0aGUgZmlsbXMgd2l0aCBsb3cgcmV2ZW51ZXMgc3RhcnRpbmcgYXQgdGhlIGhpZ2hlciBlbmQgYW5kIGp1c3QgbG9va2VkIHVwIG1vdmllcyByYW5kb21seSBhcyBJIHdlbnQgZG93biB0aGUgbGlzdCwgYW5kIHBpY2tlZCB0aGUgcG9pbnQgYXJvdW5kIHdoaWNoIEkgc3RhcnRlZCB0byBzZWUgdGhhdCBtb3N0IG1vdmllcyB0aGF0IGhhZCBlaXRoZXIgZGlyZWN0IHRvIHZpZGVvIHJlbGVhc2VzIG9yIHByaW1hcmlseSBvdmVyc2VhcyByZWxlYXNlcyAtIHdoaWNoIHdvdWxkIHVzdWFsbHkgZGlzcXVhbGlmeSBhIG1vdmllIGZyb20gYW4gQWNhZGVteSBBd2FyZCwgYXMgaXQgd291bGRuJ3QgYmUgcmVsZWFzZWQgaW4gTEEgY291bnR5Lg0KDQpTbyB3aXRoIHRoYXQsIGxldHMgdGFrZSBhIGxvb2sgYXQgaG93IHRoZXNlIGxvdy1lYXJuaW5nIG1vdmllcyBsb29rOg0KYGBge3J9DQpiYWRyZXZlbnVlcyA8LSBtb3ZpZXNbbW92aWVzJHJldmVudWUgPCAzMDAwMCxdDQpiYWRyZXZlbnVlc1tvcmRlcigtYmFkcmV2ZW51ZXMkcmV2ZW51ZSksXQ0KYGBgDQoNCk5vdGljZSB0aGF0IGEgbG90IG9mIHRoZXNlIGFyZSBkb2N1bWVudGFyaWVzLCBjb25jZXJ0IGZpbG1zLCBtYWtpbmctb2YgbW92aWVzIGFuZCBpbnRlcnZpZXdzLCBvciB0aW55IGluZGVwZW5kZW50IGZpbG1zLiAgVGFrZSBfQmxhY2thd2F5XyBmb3IgZXhhbXBsZS4gIFRoaXMgbW92aWUgaGFzIHNvbWUgYmlnIG5hbWVzIGluIGl0IC0gQW50aG9ueSBIb3BraW5zLCBSYXkgTGlvdHRhLCBKdWxpYSBTdGlsZXMgLSBhbmQgb25seSBtYWRlICQxNiwwMDAsIHNpbmNlIGl0IHdhcyBPTkxZIHJlbGVhc2VkIHRvIGludGVybmF0aW9uYWwgY2luZW1hcyBiZWZvcmUgYmVpbmcgcmVsZWFzZWQgaW4gdGhlIFVTIG92ZXIgYSB5ZWFyIGxhdGVyLiAgU28gSXQgc2VlbXMgbGlrZSBcJDMwMDAwIGlzIGEgZmFpciAgY3V0b2ZmIHBvaW50LiAgWW91J2xsIG5vdGljZSB0aGF0IHRoaXMgaXNuJ3QgYSBwZXJmZWN0IGN1dG9mZiAtIHRoZXJlIGFyZSBhIGZldyBmaWxtcyBncm9zc2luZyBtb3JlIHRoYXQgYXJlIGFsc28gaW5lbGlnaWJsZSBmb3IgYW4gT3NjYXIuICBUaGlzIGlzIGZpbmUsIEknZCByYXRoZXIgaW5jbHVkZSBpbmVsZWdpYmxlIGZpbG1zIGluIG15IGZpbmFsIGRhdGFzZXQgdGhhbiByZW1vdmUgZWxpZ2libGUgb25lcy4NCg0KWW91IGNvdWxkIGFsc28gYXNrIHdoeSBJIGRpZG4ndCBsb29rIGF0IHBvcHVsYXJpdHkgdG8gaGVscCBuYXJyb3cgdGhpcyBsaXN0IGRvd24uICBUaGF0IHdvdWxkIGJlIGJlY2F1c2UgdGhlcmUgYXJlIHBsZW50eSBvZiBPc2NhciBlbGlnaWJsZSBtb3ZpZXMgdGhhdCBhcmVuJ3QgcG9wdWxhciBiZWNhdXNlIHRoZXkncmUganVzdCBwbGFpbiBiYWQgLSBsaWtlIF9UcmFuc2Zvcm1lcnM6IERhcmsgb2YgdGhlIE1vb25fIG9yIF9YLU1lbiBPcmlnaW5zOiBXb2x2ZXJpbmVfLiAgV2Ugd2FudCB0byBrZWVwIGVsaWdpYmxlIGZpbG1zLCBnb29kIG9yIG5vdC4NCg0KU3BlYWtpbmcgb2YgcG9wdWxhcml0eSwgbGV0cyB0YWtlIGEgbG9vayBhdCB0aGF0IGNvbHVtbiBmb3Igb3V0bGllcnM6DQpgYGB7cn0NCm91dGxpZXJLRChtb3ZpZXMscG9wdWxhcml0eSkNCmBgYA0KQXMgZXhwZWN0ZWQsIG1vc3Qgb2Ygb3VyIG1vdmllcyBhcmUgbG93IGJ1ZGdldCwgbG93IHJldmVudWUgc28gdGhleSB3b24ndCBiZSByZWFsbHkgcG9wdWxhci4gIFdoYXQgaWYgd2UgdHJ5IHRoaXMgYWdhaW4gb24gb3VyICJlbGlnaWJsZSBtb3ZpZSIgc3Vic2V0Pw0KYGBge3J9DQpvdXRsaWVyS0QobW92aWVzW21vdmllcyRyZXZlbnVlID49IDMwMDAwLF0sIHBvcHVsYXJpdHkpDQpgYGANCg0KU3RpbGwgYSBsb3Qgb2YgMHMsIGJ1dCBpdHMgbXVjaCBtb3JlIGNlbnRyYWxpemVkIGFyb3VuZCAxMCBub3cuIEFnYWluLCB0aGlzIG1ha2VzIHNlbnNlIC0gcnVuYXdheSBibG9ja2J1c3RlcnMgYXJlbid0IG5lY2Vzc2FyaWx5IHRoZSBub3JtLiAgU3BlYWtpbmcgb2YsIHdoYXQgaGFwcGVucyBpZiB3ZSBvbmx5IGxvb2sgYXQgbW92aWVzIHdpdGggYXQgbGVhc3QgMTAgbWlsbGlvbiBpbiByZXZlbnVlPw0KYGBge3J9DQpvdXRsaWVyS0QobW92aWVzW21vdmllcyRyZXZlbnVlID49IDEwMDAwMDAwLF0sIHBvcHVsYXJpdHkpDQpgYGANClN0aWxsIG1vc3RseSBjZW50ZXJlZCBhcm91bmQgMTAsIGFuZCBtb3N0bHkgbm9ybWFsIGxvb2tpbmcgYWZ0ZXIgcmVtb3Zpbmcgb3V0bGllcnMsIGV2ZW4gaWYgaXQgaGFzIGEgbG9uZyB0YWlsLg0KDQpIb3dldmVyLCB3ZSBjYW4ndCByZW1vdmUgdGhlc2Ugb3V0bGllcnMgLSBtb3N0IG9mIHRoZW0gd29uIE9zY2FycyBhZnRlciBhbGwsIGFuZCB0aGF0IHdvdWxkIHRocm93IG9mZiBvdXIgY2xhc3NpZmljYXRpb24gYXR0ZW1wdHMuDQoNCldoYXQgYWJvdXQgdGhlIG51bWJlciBvZiB2b3RlcyB0aGF0IGVhY2ggbW92aWUgcmVjaWV2ZWQ/DQpgYGB7cn0NCm91dGxpZXJLRChtb3ZpZXMsIG51bV92b3RlcykNCmBgYA0KDQpBcyBleHBlY3RlZCwgbW9zdCBtb3ZpZXMgYXJlIHJlbGF0aXZlbHkgdW5rbm93biwgc28gd2UgaGF2ZSBhIGxvdCBvZiAwcy4gIENoYW5naW5nIG91ciBtaW5pbXVtIHdvbid0IGNoYW5nZSB0aGlzIGZhY3QsIGp1c3QgYmVjYXVzZSBvZiB0aGUgd2F5IHRoaXMgZGlzdHJpYnV0aW9uIGlzIHNrZXdlZC4gIEFuZCB0aGlzIGtpbmQgb2YgbWFrZXMgc2Vuc2UsIG9ubHkgdGhlIHJlYWxseSBnb29kIG9yIHJlYWxseSBiYWQgbW92aWVzIGdldCB3ZWxsIGtub3duIGVub3VnaCB0byB3YXJyZW50IGEgYnVuY2ggb2Ygdm90ZXMsIGFuZCB0aGVyZSB3b24ndCBiZSBhIGxvdCBvZiB0aG9zZS4NCg0KTGV0cyBsb29rIGF0IHJ1bnRpbWVzIG5vdzoNCmBgYHtyfQ0Kb3V0bGllcktEKG1vdmllcywgcnVudGltZSkNCmBgYA0KDQpTbyBJIGhhZG4ndCBjb25zaWRlcmVkIHRoYXQgdGhlcmUgbWlnaHQgYmUgcG9vciByZXBvcnRpbmcgZXZlbiBvbiB0aGUgcnVudGltZXMuICBXaHkgaXMgdGhlcmUgYSBtb3ZpZSB3aXRoIDEyMDAgbWludXRlcyBvZiBydW50aW1lPyAoTm90ZSwgdGhhdCAxMjAwIG1pbnV0ZSAibW92aWUiIGxvb2tzIG1vcmUgbGlrZSBhIGJhY2sgdG8gYmFjayByZWNhcCBvZiBzb21lIGZpZ2h0aW5nIHRvdXJuYW1lbnQ/ICBUaGUgbmV4dCBjbG9zZXN0IGlzIHNvbWUgaW5kaWUgZmxhc2gtYmFzZWQgYW5pbWF0ZWQgbW92aWUuICBTb21lb25lIG1hZGUgYSA2MDAgbWludXRlIG1vdmllIGVudGlyZWx5IGluIGZsYXNoPyBTZXJpb3VzbHksIHRoYXQgbnVtYmVyIGlzIGNvcnJlY3QuIEkgY2hlY2tlZC4pICBNb3N0IG9mIHRoZXNlLCB0aGFua2Z1bGx5LCBhcmUgZG9jdW1lbnRhcmllcyBhbmQgY29uY2VydCB2aWRlb3MgdGhhdCB3aWxsIGVuZCB1cCBnZXR0aW5nIHJlbW92ZWQgdGhyb3VnaCB0aGUgcmV2ZW51ZSBsaW1pdHMgd2Ugd2lsbCBpbXBvc2UuICBIb3dldmVyLCB3ZSBjYW5ub3QgZ2V0IHJpZCBvZiBvdXRsaWVycyBjb21wbGV0ZWx5IGhlcmUsIG5vdCB3aGlsZSB3ZSBhcmUgY29uc2lkZXJpbmcgdGhlIG1hcmF0aG9uIGZpbG1zIHRoYXQgYXJlIF9UaGUgTG9yZCBvZiB0aGUgUmluZ3NfIHNlcmllcy4NCg0KTm93LCBsZXRzIGNoZWNrIHRoZSByYXRpbmdzIGRpc3RyaWJ1dGlvbnM6DQpgYGB7cn0NCm91dGxpZXJLRChtb3ZpZXMsIGF2ZXJhZ2VfcmF0aW5nKQ0KYGBgDQoNCldvdWxkIHlvdSBsb29rIGF0IHRoYXQsIGl0cyBtb3N0bHkgbm9ybWFsISAgT2YgY291cnNlLCB0aGVyZSBhcmUgYSBsb3Qgb2YgMHMgYW5kIDEwLCBidXQgdGhhdCBjb21lcyBmcm9tIG1vdmllcyB3aXRoIHZlcnkgZmV3IHZvdGVzIC0gZXNzZW50aWFsbHkgbW92aWVzIHRoYXQgYXJlIHNvIGxpdHRsZSBrbm93biB0aGF0IGFsbCAxMCB2aWV3ZXJzIGVpdGhlciBoYXRlIHRoZSBtb3ZpZSBvciBsb3ZlIGl0Lg0KDQpPbmUgbGFzdCB0aGluZyB3ZSdsbCBsb29rIGF0IGlzIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIGdlbnJlczoNCmBgYHtyfQ0KZ2VucmVkaXN0cyA8LSBjKHN1bShtb3ZpZXMkYWN0aW9uKSwgc3VtKG1vdmllcyRhZHZlbnR1cmUpLCBzdW0obW92aWVzJGFuaW1hdGlvbiksIHN1bShtb3ZpZXMkY29tZWR5KSwgc3VtKG1vdmllcyRjcmltZSksIHN1bShtb3ZpZXMkZG9jdW1lbnRhcnkpLCBzdW0obW92aWVzJGRyYW1hKSwgc3VtKG1vdmllcyRmYW1pbHkpLCBzdW0obW92aWVzJGZhbnRhc3kpLCBzdW0obW92aWVzJGhpc3RvcnkpLCBzdW0obW92aWVzJGhvcnJvciksIHN1bShtb3ZpZXMkbXVzaWMpLCBzdW0obW92aWVzJG15c3RlcnkpLCBzdW0obW92aWVzJHJvbWFuY2UpLCBzdW0obW92aWVzJHRocmlsbGVyKSwgc3VtKG1vdmllcyRzY2lmaSksIHN1bShtb3ZpZXMkd2FyKSwgc3VtKG1vdmllcyR3ZXN0ZXJuKSkNCmJhcnBsb3QoZ2VucmVkaXN0cywgbmFtZXMuYXJnID0gYygiYWN0aW9uIiwgImFkdmVudHVyZSIsICJhbmltYXRpb24iLCAiY29tZWR5IiwgImNyaW1lIiwgImRvY3VtZW50YXJ5IiwgImRyYW1hIiwgImZhbWlseSIsICJmYW50YXN5IiwgImhpc3RvcnkiLCAiaG9ycm9yIiwibXVzaWMiLCAibXlzdGVyeSIsICJyb21hbmNlIiwgInRocmlsbGVyIiwgInNjaWZpIiwgIndhciIsICJ3ZXN0ZXJuIikpDQpnZW5yZWRpc3RzDQpgYGANCg0KU28sIG1vc3Qgb2YgdGhlc2UgbW92aWVzIGFyZSBkcmFtYXMsIGNvbWVkaWVzLCB0aHJpbGxlcnMsIGFjdGlvbiwgaG9ycm9yLCBvciBzb21lIGNvbWJpbmF0aW9uIG9mIHRob3NlLiAgR29vZCB0byBrbm93Lg0KDQpOb3csIGxldHMgbG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNyZWRpdHMgZm9yIHRoZSBhY3RvcnM6DQpgYGB7cn0NCm91dGxpZXJLRChhY3RvcnMsIG1vdmllX2NyZWRpdHMpDQpgYGANClNvIEknZCBsaWtlIHRvIHBvaW50IG91dCB0aGF0IHRoZSB0b3AgdHdvIGFjdG9ycyBpbiB0ZXJtcyBvZiBjcmVkaXRzIGFyZSBSb24gSmVyZW15IGFuZCBFdmFuIHN0b25lLiAgRE9OJ1QgbG9vayB0aGVtIHVwLCB0aGV5IGFyZSBOU0ZXLiAgU29tZWhvdywgdGhlc2UgYWN0b3JzIG11c3QgaGF2ZSBnb3R0ZW4gcm9sZXMgaW4gbm9uLWFkdWx0IGZpbG1zLiAgQWxzbyBvZiBub3RlLCBSb24gSmVyZW15IGlzIG1vcmUgcG9wdWxhciB0aGF0IEphY2tpZSBDaGFuLiAgU29tZWhvdy4NCg0KQW55d2F5LCBjaGFuZ2luZyB0aGUgbWluaW11bSBvZiBvdXIgb3V0bGllciBjaGVjayB3b24ndCBkbyBtdWNoIGhlcmUgZHVlIHRvIHRoZSBzaGFwZSBvZiB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgd2UgY2FuJ3QgcmVhbGx5IHJlbW92ZSBvdXRsaWVycyBoZXJlIGFueXdheSBhcyBtb3N0IG9mIHRoZSBiZXN0IGFjdG9ycyBoYXZlIGp1c3QgdG9ucyBvZiBjcmVkaXRzLg0KDQpMb29raW5nIGF0IHRoZWlyIHBvcHVsYXJpdHkgbmV4dDoNCmBgYHtyfQ0Kb3V0bGllcktEKGFjdG9ycywgcG9wdWxhcml0eSkNCmBgYA0KVGhpcyBmYWxscyBpbnRvIHRoZSBzYW1lIGJvYXQgYXMgdGhlIGNyZWRpdHMgY2hlY2sgLSBjYW4ndCByZW1vdmUgdGhlIG91dGxpZXJzIGFzIHRoZSBtb3N0IHBvcHVsYXIgYWN0b3JzIGFyZSBhbHNvIHRoZSBzYW1lIG9uZXMgaW4gbW92aWVzIHRoYXQgd2luIG9zY2Fycy4NCg0KV2UnbGwgZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGRpcmVjdG9ycywgYnV0IGl0IHdvbnQgY2hhbmdlIG11Y2guDQpgYGB7cn0NCm91dGxpZXJLRChkaXJlY3RvcnMsIG1vdmllX2NyZWRpdHMpDQpgYGANCkFnYWluLCBnb29kIGRpcmVjdG9ycyBoYXZlIGEgbG90IG1vcmUgY3JlZGl0cyAtIGp1c3QgdGhpbmsgb2YgU3BlaWxiZXJnLiAgQ2FuJ3QgcmVtb3ZlIG91dGxpZXJzIGhlcmUuDQoNCmBgYHtyfQ0Kb3V0bGllcktEKGRpcmVjdG9ycywgcG9wdWxhcml0eSkNCmBgYA0KDQpJIHdhc24ndCByZWFsbHkgZXhwZWN0aW5nIHRoaXMgb25lIHRvIGJlIHNvIGhlYXZpbHkgc2tld2VkLCBuZWFybHkgYWxsIG9mIHRoZSBudW1iZXJzIGFyZSAwLiAgU28gZXZlcnl0aGluZyBpcyBhbiBvdXRsaWVyLCByZWFsbHkuICBDYW4ndCByZW1vdmUgdGhlbSB0aG91Z2gsIHNhbWUgcmVhc29uaW5nIGFzIGFib3ZlLg0KDQpOb3csIHRoZXNlIG5leHQgY291cGxlIG9uZXMgYXJlIG9ubHkgYWN0b3JzIGFuZCB0aGF0IGhhdmUgd29uIG9yIGJlZW4gbm9taW5hdGVkIGZvciBvc2NhcnMsIHNvIG91dGxpZXJzIGNhbm5vdCBiZSByZW1vdmVkLg0KYGBge3J9DQpvdXRsaWVyS0QoZGlyZWN0b3Jvc2NhcnMsIG5vbWluYXRpb25zKQ0KYGBgDQpgYGB7cn0NCm91dGxpZXJLRChkaXJlY3Rvcm9zY2Fycywgd2lucykNCmBgYA0KYGBge3J9DQpvdXRsaWVyS0QoYWN0b3Jvc2NhcnMsIG5vbWluYXRpb25zKQ0KYGBgDQpgYGB7cn0NCm91dGxpZXJLRChhY3Rvcm9zY2Fycywgd2lucykNCmBgYA0KQXMgZXhwZWN0ZWQsIG1vc3QgdmFsdWVzIGFyZSByZWFsbHkgc21hbGwsIGNsb3NlIHRvIDAgb3IgMS4gIFRoZXJlIGFyZSBhIGZldyBzdGFuZG91dHMsIGJ1dCBub3QgbWFueS4NCg0KTm93IHRoYXQgd2UgaGF2ZSBhIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIG91ciBkYXRhLCBpdHMgdGltZSB0byBjb21wb3NlIGV2ZXJ5dGhpbmcgdG9nZXRoZXIgaW50byBhIGZpbmFsIGFuYWx5dGljYWwgc3RvcmUuDQoNCiNQaGFzZSAzOiBEYXRhIFByZXBhcmF0aW9uDQoNCipEYXRhIENsZWFuaW5nKg0KDQpUaGUgZmlyc3QgdGhpbmcgd2UnbGwgaGF2ZSB0byBkbyBpcyByZW1vdmUgYW55IHJvd3Mgd2hlcmUgYWxsIDEwIGFjdG9ycyBvciBhbGwgMyBkaXJlY3RvcnMgYXJlIE5Bcy4gIFRoaXMgaXMgYmVjYXVzZSB0aGVzZSBjb2x1bW5zIGFyZSBuaWdoIGltcG9zc2libGUgdG8gaW1wdXRlLiAgU28gaWYgd2UgaGF2ZSBhYnNvbHV0ZWx5IDAgaW5mb3JtYXRpb24sIHdlIHJlYWxseSBoYXZlIG5vIG90aGVyIGNob2ljZSBidXQgdG8gcmVtb3ZlIHRoZW0uIE5vdywgc2luY2Ugd2Uga25vdyB0aGF0IHRoZSBzY3JhcGVyIGZpbGxzIGluIGFjdG9ycyBhbmQgZGlyZWN0b3JzIGZyb20gMSB0byBuLCB0aGVuIHdlIGNhbiBiYXNpY2FsbHkgcmVtb3ZlIGFueSByb3cgdGhhdCBoYXMgbmEgZm9yIGFjdG9yXzEsIGRpcmVjdG9yXzEsIG9yIGJvdGguDQpgYGB7cn0NCm1vdmllcyA8LSBtb3ZpZXNbIShpcy5uYShtb3ZpZXMkYWN0b3JfMSkgfHwgaXMubmEobW92aWVzJGRpcmVjdG9yXzEpKSxdDQpgYGANCg0KTmV4dCwgd2UnbGwgZmlsbCBpbiB0aGUgcmVhbCBidWRnZXRzIGZvciB0aG9zZSAyMyBtb3ZpZXMgdGhhdCB3ZSBsb29rZWQgdXAuDQpgYGB7cn0NCm1vdmllc1ttb3ZpZXMkbWlkID09IDEyNjg5LF0kYnVkZ2V0IDwtIDEwMDA3MTUNCm1vdmllc1ttb3ZpZXMkbWlkID09IDU5Mjk2LF0kYnVkZ2V0IDwtIDEyMDAwMDANCm1vdmllc1ttb3ZpZXMkbWlkID09IDI4NzUyNCxdJGJ1ZGdldCA8LSAxMTAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSA5MTU1MSxdJGJ1ZGdldCA8LSA0NzAxMTk2DQptb3ZpZXNbbW92aWVzJG1pZCA9PSAxNDQyNCxdJGJ1ZGdldCA8LSA1MDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSAxNDA1NSxdJGJ1ZGdldCA8LSA4Mjg3MDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSAyMTk2LF0kYnVkZ2V0IDwtIDkwMDAwMDANCm1vdmllc1ttb3ZpZXMkbWlkID09IDU3NTg1LF0kYnVkZ2V0IDwtIDEwMDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSA3ODM4MyxdJGJ1ZGdldCA8LSAxMDAwMDAwMA0KbW92aWVzW21vdmllcyRtaWQgPT0gMjA4ODY5LF0kYnVkZ2V0IDwtIDYxNTE1MzgNCm1vdmllc1ttb3ZpZXMkbWlkID09IDc5MSxdJGJ1ZGdldCA8LSAxODAwMDAwMA0KbW92aWVzW21vdmllcyRtaWQgPT0gMTEyMzcsXSRidWRnZXQgPC0gMjUwMDAwMDANCm1vdmllc1ttb3ZpZXMkbWlkID09IDIxNzI0LF0kYnVkZ2V0IDwtIDI1MDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSA2OTMzLF0kYnVkZ2V0IDwtIDI3MDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSAxNjEzLF0kYnVkZ2V0IDwtIDI3MDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSAyMDQ0MzYsXSRidWRnZXQgPC0gMzM3NDYzMDINCm1vdmllc1ttb3ZpZXMkbWlkID09IDExODg4LF0kYnVkZ2V0IDwtIDM1MDAwMDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSA1MDIxNyxdJGJ1ZGdldCA8LSA5MzAwMA0KbW92aWVzW21vdmllcyRtaWQgPT0gMjM5ODgsXSRidWRnZXQgPC0gMTA4MDAwDQptb3ZpZXNbbW92aWVzJG1pZCA9PSA1ODIzNSxdJGJ1ZGdldCA8LSAyMDAwMDANCm1vdmllc1ttb3ZpZXMkbWlkID09IDE1ODc1MixdJGJ1ZGdldCA8LSA2NTAwMDANCm1vdmllc1ttb3ZpZXMkbWlkID09IDE0MTM4LF0kYnVkZ2V0IDwtIDcwMDAwMA0KYGBgDQpOb3csIHdlJ2xsIHJlbW92ZSByb3dzIGJhc2VkIG9mZiB0aGUgY2FsY3VsYXRlZCBsaW1pdHMgZnJvbSBvdXIgZXhwbG9yYXRpb246ICQ3MDAwIGJ1ZGdldCBhbmQgNTAgdm90ZSBtaW5pbXVtLg0KYGBge3J9DQpucm93KG1vdmllcykNCm1vdmllcyA8LSBtb3ZpZXNbbW92aWVzJGJ1ZGdldCA+PSA3MDAwLF0NCm1vdmllcyA8LSBtb3ZpZXNbIShpcy5uYShtb3ZpZXMkYnVkZ2V0KSksXQ0KbW92aWVzIDwtIG1vdmllc1ttb3ZpZXMkbnVtX3ZvdGVzID49IDUwLF0NCm5yb3cobW92aWVzKQ0KYGBgDQpTbywgd2UndmUgbGVhcm5lZCB0aGF0IGluIGFib3V0IHRoZSBsYXN0IDE2IHllYXJzIG9mIGNpbmVtYSwgdGhlcmUgaGF2ZSBiZWVuICphbG1vc3QgMTAwMDAqIGxpdHRsZSBrbm93biwgbG93IGJ1ZGdldCBmaWxtcyB0aGF0IGxpa2VseSB3b3VsZG4ndCBoYXZlIGdvdHRlbiBlbGlnaWJpbGl0eSBmb3IgYW4gb3NjYXIuICBBbmQgdGhhdHMgZXZlbiBiZWZvcmUgdGhlIHVwY29taW5nIHJldmVudWUgY2hlY2s6DQpgYGB7cn0NCm1vdmllcyA8LSBtb3ZpZXNbbW92aWVzJHJldmVudWUgPj0gMzAwMDAsXQ0KbW92aWVzDQpgYGANCldpdGggdGhhdCB3ZSBsb3NlIGFub3RoZXIgMTAwMCBmaWxtcywgbW9zdGx5IGluZGVwZW5kZW50LCB0aGF0IHdvdWxkbnQgYmUgZWxpZ2libGUgZm9yIG9zY2Fycy4NCmBgYHtyfQ0Kb3V0bGllcktEKG1vdmllcywgcnVudGltZSkNCmBgYA0KQXMgd2UgY2FuIHNlZSBmcm9tIHRoZSBxdWljayBydW50aW1lIGNoZWNrIG1hZGUgYWJvdmUsIHRoaXMgc2V0IG9mIGxpbWl0cyBoYXMgYWxzbyBjdXQgb3V0IG1vc3Qgb2YgdGhvc2Ugb2JzY2VuZWx5IGxvbmcgb3IgbGF1Z2hhYmx5IHNob3J0IGZpbG1zIC0gdGhlIHNob3J0ZXN0IGZpbG0gbGlzdGVkIG5vdyBpcyA2MyBtaW51dGVzLCAyMCBtaW51dGVzIGdyZWF0ZXIgdGhhbiB0aGUgQWNhZGVteSdzIDQwIG1pbnV0ZSBtaW5pbXVtIHRvIGJlIGNvbnNpZGVyZWQgYSBmZWF0dXJlIGxlbmd0aCBmaWxtLiAgQnkgdGhlIHdheSwgdGhpcyA2MyBtaW51dGUgbW92aWUgaXMgX1dpbm5pZSB0aGUgUG9vaF8sIGluIGNhc2UgeW91IHdlcmUgd29uZGVyaW5nLiAgIA0KDQoqRmVhdHVyZSBFbmdpbmVlcmluZyoNCk5vdyBhbGwgdGhhdCdzIGxlZnQgaXMgdG8gYWRkIGluIGEgZmV3IGVuZ2luZWVyZWQgZmVhdHVyZXMgLSB0b3RhbCBhY3RvciBjcmVkaXRzLCBhdmVyYWdlIGFjdG9yIHBvcHVsYXJpdHksIHRvdGFsIGFjdG9yIG9zY2FyIG5vbWluYXRpb25zLCB0b3RhbCBhY3RvciBvc2NhciB3aW5zLCB0b3RhbCBkaXJlY3RvciBjcmVkaXRzLCBhdmVyYWdlIGRpcmVjdG9yIHBvcHVsYXJpdHksIHRvdGFsIGRpcmVjdG9yIG9zY2FyIG5vbWluYXRpb25zLCB0b3RhbCBkaXJlY3RvciBvc2NhciB3aW5zLCBhbmQgdGhlIGFjdHVhbCBjbGFzc2lmaWNhdGlvbiB0YWIuICBMZXRzIHN0YXJ0IHdpdGggdGhlIGFjdG9yIGRldGFpbHMuICBUaG91Z2gsIGZpcnN0LCB3ZSBuZWVkIHRvIGdldCByaWQgb2YganVzdCBvbmUgbW9yZSByb3cgLSB0aGlzIG1vdmllIGhhcyBpZHMgdGhhdCBhcmUganVzdCBnYXJiYWdlIGFuZCBkb250IGV4aXN0IGFueXdoZXJlLg0KDQpgYGB7cn0NCm1vdmllcyA8LSBtb3ZpZXNbLWMoODc2KSxdDQpgYGANCg0KDQoNCmBgYHtyfQ0KdG90YWN0Y3JlZHMgPC0gbnVtZXJpYygpDQphdmdhY3Rwb3AgPC0gbnVtZXJpYygpDQp0b3RhY3Rub21zIDwtIG51bWVyaWMoKQ0KdG90YWN0d2lucyA8LSBudW1lcmljKCkNCmZvciAobW92aWUgaW4gYygxOm5yb3cobW92aWVzKSkpIHsNCiAgYWN0b3JjcmVkaXRzIDwtIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfMVttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzFbbW92aWVdLF0kbW92aWVfY3JlZGl0cywNCiAgICAxMA0KICApDQogIGFjdHN1bXBvcCA8LSBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzFbbW92aWVdLF0pPjAsDQogICAgYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl8xW21vdmllXSxdJHBvcHVsYXJpdHksDQogICAgNQ0KICApDQogIA0KICAjb25seSB3YXkgSSBjb3VsZCBlbmZvcmNlIGEgc29ydCBvZiBsYXp5IGV2YWx1YXRpb24uLi4NCiAgYWN0bm9tcyA8LSBpZihucm93KGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzFbbW92aWVdLF0kYWN0b3JfbmFtZSxdKSA+IDApew0KICAgIGlmKCEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMpKSl7DQogICAgICBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8xW21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucw0KICAgIH0NCiAgfSBlbHNlew0KICAgIDANCiAgfQ0KICANCiAgDQogIGFjdHdpbnMgPC0gaWZlbHNlKA0KICAgIG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCAmJg0KICAgICAgIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8xW21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zKSksDQogICAgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAwKSANCiAgDQogIGlmKCEoaXMubmEobW92aWVzJGFjdG9yXzJbbW92aWVdKSkpew0KICAgIGFjdG9yY3JlZGl0cyA8LSBhY3RvcmNyZWRpdHMgKyBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzJbbW92aWVdLF0pPjAsDQogICAgYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl8yW21vdmllXSxdJG1vdmllX2NyZWRpdHMsDQogICAgMTANCiAgKQ0KICAgIGFjdHN1bXBvcCA8LSBhY3RzdW1wb3AgKyBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzJbbW92aWVdLF0pPjAsDQogICAgYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl8yW21vdmllXSxdJHBvcHVsYXJpdHksDQogICAgNQ0KICApDQogIGlmKG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCl7DQogICAgaWYoIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8yW21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucykpKXsNCiAgICAgIGFjdG5vbXMgPC0gYWN0bm9tcyArIGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzJbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zDQogICAgfQ0KICB9DQogICAgYWN0d2lucyA8LSBhY3R3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8yW21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwICYmDQogICAgICAgICEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucykpLA0KICAgICAgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApIA0KICB9IGVsc2UgaWYoaXMubmEobW92aWVzJGFjdG9yXzJbbW92aWVdKSl7DQogICAgdG90YWN0Y3JlZHMgPC0gYyh0b3RhY3RjcmVkcywgYWN0b3JjcmVkaXRzKQ0KICAgIGF2Z2FjdHBvcCA8LSBjKGF2Z2FjdHBvcCwgYWN0c3VtcG9wKQ0KICAgIHRvdGFjdG5vbXMgPC0gYyh0b3RhY3Rub21zLCBhY3Rub21zKQ0KICAgIHRvdGFjdHdpbnMgPC0gYyh0b3RhY3R3aW5zLCBhY3R3aW5zKQ0KICAgIG5leHQNCiAgfQ0KICANCiAgaWYoIShpcy5uYShtb3ZpZXMkYWN0b3JfM1ttb3ZpZV0pKSl7DQogICAgYWN0b3JjcmVkaXRzIDwtIGFjdG9yY3JlZGl0cyArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfM1ttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzNbbW92aWVdLF0kbW92aWVfY3JlZGl0cywNCiAgICAxMA0KICApDQogICAgYWN0c3VtcG9wIDwtIGFjdHN1bXBvcCArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfM1ttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzNbbW92aWVdLF0kcG9wdWxhcml0eSwNCiAgICA1DQogICkNCiAgICANCiAgaWYobnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8zW21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwKXsNCiAgICBpZighKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzNbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zKSkpew0KICAgICAgYWN0bm9tcyA8LSBhY3Rub21zICsgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfM1ttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMNCiAgICB9DQogIH0NCiAgICBhY3R3aW5zIDwtIGFjdHdpbnMgKyBpZmVsc2UoDQogICAgICBucm93KGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzNbbW92aWVdLF0kYWN0b3JfbmFtZSxdKSA+IDAgJiYNCiAgICAgICAgIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8zW21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zKSksDQogICAgICBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8zW21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zLA0KICAgICAgMCkgDQogIH0gZWxzZSBpZihpcy5uYShtb3ZpZXMkYWN0b3JfM1ttb3ZpZV0pKXsNCiAgICB0b3RhY3RjcmVkcyA8LSBjKHRvdGFjdGNyZWRzLCBhY3RvcmNyZWRpdHMpDQogICAgYXZnYWN0cG9wIDwtIGMoYXZnYWN0cG9wLCBhY3RzdW1wb3AvMikNCiAgICB0b3RhY3Rub21zIDwtIGModG90YWN0bm9tcywgYWN0bm9tcykNCiAgICB0b3RhY3R3aW5zIDwtIGModG90YWN0d2lucywgYWN0d2lucykNCiAgICBuZXh0DQogIH0NCiAgDQogIGlmKCEoaXMubmEobW92aWVzJGFjdG9yXzRbbW92aWVdKSkpew0KICAgIGFjdG9yY3JlZGl0cyA8LSBhY3RvcmNyZWRpdHMgKyBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzRbbW92aWVdLF0pPjAsDQogICAgYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl80W21vdmllXSxdJG1vdmllX2NyZWRpdHMsDQogICAgMTANCiAgKQ0KICAgIGFjdHN1bXBvcCA8LSBhY3RzdW1wb3AgKyBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzRbbW92aWVdLF0pPjAsDQogICAgYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl80W21vdmllXSxdJHBvcHVsYXJpdHksDQogICAgNQ0KICApDQogICAgaWYobnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl80W21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwKXsNCiAgICAgIGlmKCEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMpKSl7DQogICAgICAgIGFjdG5vbXMgPC0gYWN0bm9tcyArIGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzRbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zDQogICAgICB9DQogICAgfQ0KICAgIGFjdHdpbnMgPC0gYWN0d2lucyArIGlmZWxzZSgNCiAgICAgIG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCAmJg0KICAgICAgICAhKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzRbbW92aWVdLF0kYWN0b3JfbmFtZSxdJHdpbnMpKSwNCiAgICAgIGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzRbbW92aWVdLF0kYWN0b3JfbmFtZSxdJHdpbnMsDQogICAgICAwKSANCiAgfSBlbHNlIGlmKGlzLm5hKG1vdmllcyRhY3Rvcl80W21vdmllXSkpew0KICAgIHRvdGFjdGNyZWRzIDwtIGModG90YWN0Y3JlZHMsIGFjdG9yY3JlZGl0cykNCiAgICBhdmdhY3Rwb3AgPC0gYyhhdmdhY3Rwb3AsIGFjdHN1bXBvcC8zKQ0KICAgIHRvdGFjdG5vbXMgPC0gYyh0b3RhY3Rub21zLCBhY3Rub21zKQ0KICAgIHRvdGFjdHdpbnMgPC0gYyh0b3RhY3R3aW5zLCBhY3R3aW5zKQ0KICAgIG5leHQNCiAgfQ0KICANCiAgaWYoIShpcy5uYShtb3ZpZXMkYWN0b3JfNVttb3ZpZV0pKSl7DQogICAgYWN0b3JjcmVkaXRzIDwtIGFjdG9yY3JlZGl0cyArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfNVttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzVbbW92aWVdLF0kbW92aWVfY3JlZGl0cywNCiAgICAxMA0KICApDQogICAgYWN0c3VtcG9wIDwtIGFjdHN1bXBvcCArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfNVttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzVbbW92aWVdLF0kcG9wdWxhcml0eSwNCiAgICA1DQogICkNCiAgICBpZihucm93KGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzVbbW92aWVdLF0kYWN0b3JfbmFtZSxdKSA+IDApew0KICAgICAgaWYoIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl81W21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucykpKXsNCiAgICAgICAgYWN0bm9tcyA8LSBhY3Rub21zICsgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMNCiAgICAgIH0NCiAgICB9DQogICAgYWN0d2lucyA8LSBhY3R3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl81W21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwICYmDQogICAgICAgICEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucykpLA0KICAgICAgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApIA0KICB9IGVsc2UgaWYoaXMubmEobW92aWVzJGFjdG9yXzVbbW92aWVdKSl7DQogICAgdG90YWN0Y3JlZHMgPC0gYyh0b3RhY3RjcmVkcywgYWN0b3JjcmVkaXRzKQ0KICAgIGF2Z2FjdHBvcCA8LSBjKGF2Z2FjdHBvcCwgYWN0c3VtcG9wLzQpDQogICAgdG90YWN0bm9tcyA8LSBjKHRvdGFjdG5vbXMsIGFjdG5vbXMpDQogICAgdG90YWN0d2lucyA8LSBjKHRvdGFjdHdpbnMsIGFjdHdpbnMpDQogICAgbmV4dA0KICB9DQogIA0KICBpZighKGlzLm5hKG1vdmllcyRhY3Rvcl82W21vdmllXSkpKXsNCiAgICBhY3RvcmNyZWRpdHMgPC0gYWN0b3JjcmVkaXRzICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl82W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfNlttb3ZpZV0sXSRtb3ZpZV9jcmVkaXRzLA0KICAgIDEwDQogICkNCiAgICBhY3RzdW1wb3AgPC0gYWN0c3VtcG9wICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl82W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfNlttb3ZpZV0sXSRwb3B1bGFyaXR5LA0KICAgIDUNCiAgKQ0KICAgIGlmKG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCl7DQogICAgICBpZighKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzZbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zKSkpew0KICAgICAgICBhY3Rub21zIDwtIGFjdG5vbXMgKyBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl82W21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucw0KICAgICAgfQ0KICAgIH0gDQogICAgYWN0d2lucyA8LSBhY3R3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl82W21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwICYmDQogICAgICAgICEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucykpLA0KICAgICAgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfNlttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApIA0KICB9IGVsc2UgaWYoaXMubmEobW92aWVzJGFjdG9yXzZbbW92aWVdKSl7DQogICAgdG90YWN0Y3JlZHMgPC0gYyh0b3RhY3RjcmVkcywgYWN0b3JjcmVkaXRzKQ0KICAgIGF2Z2FjdHBvcCA8LSBjKGF2Z2FjdHBvcCwgYWN0c3VtcG9wLzUpDQogICAgdG90YWN0bm9tcyA8LSBjKHRvdGFjdG5vbXMsIGFjdG5vbXMpDQogICAgdG90YWN0d2lucyA8LSBjKHRvdGFjdHdpbnMsIGFjdHdpbnMpDQogICAgbmV4dA0KICB9DQogIA0KICBpZighKGlzLm5hKG1vdmllcyRhY3Rvcl83W21vdmllXSkpKXsNCiAgICBhY3RvcmNyZWRpdHMgPC0gYWN0b3JjcmVkaXRzICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl83W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfN1ttb3ZpZV0sXSRtb3ZpZV9jcmVkaXRzLA0KICAgIDEwDQogICkNCiAgICBhY3RzdW1wb3AgPC0gYWN0c3VtcG9wICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl83W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfN1ttb3ZpZV0sXSRwb3B1bGFyaXR5LA0KICAgIDUNCiAgKQ0KICAgIGlmKG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfN1ttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCl7DQogICAgICBpZighKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzdbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zKSkpew0KICAgICAgICBhY3Rub21zIDwtIGFjdG5vbXMgKyBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl83W21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucw0KICAgICAgfQ0KICAgIH0gDQogICAgYWN0d2lucyA8LSBhY3R3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl83W21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwICYmDQogICAgICAgICEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfN1ttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucykpLA0KICAgICAgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfN1ttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApIA0KICB9IGVsc2UgaWYoaXMubmEobW92aWVzJGFjdG9yXzdbbW92aWVdKSl7DQogICAgdG90YWN0Y3JlZHMgPC0gYyh0b3RhY3RjcmVkcywgYWN0b3JjcmVkaXRzKQ0KICAgIGF2Z2FjdHBvcCA8LSBjKGF2Z2FjdHBvcCwgYWN0c3VtcG9wLzYpDQogICAgdG90YWN0bm9tcyA8LSBjKHRvdGFjdG5vbXMsIGFjdG5vbXMpDQogICAgdG90YWN0d2lucyA8LSBjKHRvdGFjdHdpbnMsIGFjdHdpbnMpDQogICAgbmV4dA0KICB9DQogIA0KICBpZighKGlzLm5hKG1vdmllcyRhY3Rvcl84W21vdmllXSkpKXsNCiAgICBhY3RvcmNyZWRpdHMgPC0gYWN0b3JjcmVkaXRzICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl84W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfOFttb3ZpZV0sXSRtb3ZpZV9jcmVkaXRzLA0KICAgIDEwDQogICkNCiAgICBhY3RzdW1wb3AgPC0gYWN0c3VtcG9wICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl84W21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfOFttb3ZpZV0sXSRwb3B1bGFyaXR5LA0KICAgIDUNCiAgKQ0KICAgICBpZihucm93KGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzhbbW92aWVdLF0kYWN0b3JfbmFtZSxdKSA+IDApew0KICAgICAgaWYoIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl84W21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucykpKXsNCiAgICAgICAgYWN0bm9tcyA8LSBhY3Rub21zICsgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfOFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMNCiAgICAgIH0NCiAgICB9IA0KICAgIGFjdHdpbnMgPC0gYWN0d2lucyArIGlmZWxzZSgNCiAgICAgIG5yb3coYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfOFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCAmJg0KICAgICAgICAhKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzhbbW92aWVdLF0kYWN0b3JfbmFtZSxdJHdpbnMpKSwNCiAgICAgIGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzhbbW92aWVdLF0kYWN0b3JfbmFtZSxdJHdpbnMsDQogICAgICAwKSANCiAgfSBlbHNlIGlmKGlzLm5hKG1vdmllcyRhY3Rvcl84W21vdmllXSkpew0KICAgIHRvdGFjdGNyZWRzIDwtIGModG90YWN0Y3JlZHMsIGFjdG9yY3JlZGl0cykNCiAgICBhdmdhY3Rwb3AgPC0gYyhhdmdhY3Rwb3AsIGFjdHN1bXBvcC83KQ0KICAgIHRvdGFjdG5vbXMgPC0gYyh0b3RhY3Rub21zLCBhY3Rub21zKQ0KICAgIHRvdGFjdHdpbnMgPC0gYyh0b3RhY3R3aW5zLCBhY3R3aW5zKQ0KICAgIG5leHQNCiAgfQ0KICANCiAgaWYoIShpcy5uYShtb3ZpZXMkYWN0b3JfOVttb3ZpZV0pKSl7DQogICAgYWN0b3JjcmVkaXRzIDwtIGFjdG9yY3JlZGl0cyArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfOVttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzlbbW92aWVdLF0kbW92aWVfY3JlZGl0cywNCiAgICAxMA0KICApDQogICAgYWN0c3VtcG9wIDwtIGFjdHN1bXBvcCArIGlmZWxzZSgNCiAgICBucm93KGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfOVttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzlbbW92aWVdLF0kcG9wdWxhcml0eSwNCiAgICA1DQogICkNCiAgICAgaWYobnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl85W21vdmllXSxdJGFjdG9yX25hbWUsXSkgPiAwKXsNCiAgICAgIGlmKCEoaXMubmEoYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfOVttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMpKSl7DQogICAgICAgIGFjdG5vbXMgPC0gYWN0bm9tcyArIGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzlbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zDQogICAgICB9DQogICAgfSANCiAgICBhY3R3aW5zIDwtIGFjdHdpbnMgKyBpZmVsc2UoDQogICAgICBucm93KGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzlbbW92aWVdLF0kYWN0b3JfbmFtZSxdKSA+IDAgJiYNCiAgICAgICAgIShpcy5uYShhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl85W21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zKSksDQogICAgICBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl85W21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zLA0KICAgICAgMCkgDQogIH0gZWxzZSBpZihpcy5uYShtb3ZpZXMkYWN0b3JfOVttb3ZpZV0pKXsNCiAgICB0b3RhY3RjcmVkcyA8LSBjKHRvdGFjdGNyZWRzLCBhY3RvcmNyZWRpdHMpDQogICAgYXZnYWN0cG9wIDwtIGMoYXZnYWN0cG9wLCBhY3RzdW1wb3AvOCkNCiAgICB0b3RhY3Rub21zIDwtIGModG90YWN0bm9tcywgYWN0bm9tcykNCiAgICB0b3RhY3R3aW5zIDwtIGModG90YWN0d2lucywgYWN0d2lucykNCiAgICBuZXh0DQogIH0NCiAgDQogIGlmKCEoaXMubmEobW92aWVzJGFjdG9yXzEwW21vdmllXSkpKXsNCiAgICBhY3RvcmNyZWRpdHMgPC0gYWN0b3JjcmVkaXRzICsgaWZlbHNlKA0KICAgIG5yb3coYWN0b3JzW2FjdG9ycyRhaWQ9PW1vdmllcyRhY3Rvcl8xMFttb3ZpZV0sXSk+MCwNCiAgICBhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzEwW21vdmllXSxdJG1vdmllX2NyZWRpdHMsDQogICAgMTANCiAgKQ0KICAgIGFjdHN1bXBvcCA8LSBhY3RzdW1wb3AgKyBpZmVsc2UoDQogICAgbnJvdyhhY3RvcnNbYWN0b3JzJGFpZD09bW92aWVzJGFjdG9yXzEwW21vdmllXSxdKT4wLA0KICAgIGFjdG9yc1thY3RvcnMkYWlkPT1tb3ZpZXMkYWN0b3JfMTBbbW92aWVdLF0kcG9wdWxhcml0eSwNCiAgICA1DQogICkNCiAgICAgaWYobnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8xMFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCl7DQogICAgICBpZighKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzEwW21vdmllXSxdJGFjdG9yX25hbWUsXSRub21pbmF0aW9ucykpKXsNCiAgICAgICAgYWN0bm9tcyA8LSBhY3Rub21zICsgYWN0b3Jvc2NhcnNbYWN0b3Jvc2NhcnMkbmFtZSA9PSBhY3RvcnNbYWN0b3JzJGFpZCA9PSBtb3ZpZXMkYWN0b3JfMTBbbW92aWVdLF0kYWN0b3JfbmFtZSxdJG5vbWluYXRpb25zDQogICAgICB9DQogICAgfSAgDQogICAgYWN0d2lucyA8LSBhY3R3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8xMFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0pID4gMCAmJg0KICAgICAgICAhKGlzLm5hKGFjdG9yb3NjYXJzW2FjdG9yb3NjYXJzJG5hbWUgPT0gYWN0b3JzW2FjdG9ycyRhaWQgPT0gbW92aWVzJGFjdG9yXzEwW21vdmllXSxdJGFjdG9yX25hbWUsXSR3aW5zKSksDQogICAgICBhY3Rvcm9zY2Fyc1thY3Rvcm9zY2FycyRuYW1lID09IGFjdG9yc1thY3RvcnMkYWlkID09IG1vdmllcyRhY3Rvcl8xMFttb3ZpZV0sXSRhY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApIA0KICAgIA0KICAgIHRvdGFjdGNyZWRzIDwtIGModG90YWN0Y3JlZHMsIGFjdG9yY3JlZGl0cykNCiAgICBhdmdhY3Rwb3AgPC0gYyhhdmdhY3Rwb3AsIGFjdHN1bXBvcC8xMCkNCiAgICB0b3RhY3Rub21zIDwtIGModG90YWN0bm9tcywgYWN0bm9tcykNCiAgICB0b3RhY3R3aW5zIDwtIGModG90YWN0d2lucywgYWN0d2lucykNCiAgfSBlbHNlIGlmKGlzLm5hKG1vdmllcyRhY3Rvcl8xMFttb3ZpZV0pKXsNCiAgICB0b3RhY3RjcmVkcyA8LSBjKHRvdGFjdGNyZWRzLCBhY3RvcmNyZWRpdHMpDQogICAgYXZnYWN0cG9wIDwtIGMoYXZnYWN0cG9wLCBhY3RzdW1wb3AvOSkNCiAgICB0b3RhY3Rub21zIDwtIGModG90YWN0bm9tcywgYWN0bm9tcykNCiAgICB0b3RhY3R3aW5zIDwtIGModG90YWN0d2lucywgYWN0d2lucykNCiAgICBuZXh0DQogIH0NCn0NCmBgYA0KDQpUaGF0IHdhcyBhIGh1Z2UgbG9vcC4uLmFuZCB3ZSBnZXQgdG8gZG8gaXQgYWdhaW4gZm9yIHRoZSBkaXJlY3RvciBkZXRhaWxzIGFzIHdlbGw6DQpgYGB7cn0NCnRvdGRpcmNyZWRzIDwtIG51bWVyaWMoKQ0KYXZnZGlycG9wIDwtIG51bWVyaWMoKQ0KdG90ZGlybm9tcyA8LSBudW1lcmljKCkNCnRvdGRpcndpbnMgPC0gbnVtZXJpYygpDQpmb3IgKG1vdmllIGluIGMoMTpucm93KG1vdmllcykpKSB7DQogIGRpcmVjdG9yY3JlZGl0cyA8LWlmZWxzZShucm93KGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkPT1tb3ZpZXMkZGlyZWN0b3JfMVttb3ZpZV0sXSk+MCwNCiAgICBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZD09bW92aWVzJGRpcmVjdG9yXzFbbW92aWVdLF0kbW92aWVfY3JlZGl0cywNCiAgICA1DQogICkNCiAgZGlyc3VtcG9wIDwtIGlmZWxzZShucm93KGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkPT1tb3ZpZXMkZGlyZWN0b3JfMVttb3ZpZV0sXSk+MCwNCiAgICBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZD09bW92aWVzJGRpcmVjdG9yXzFbbW92aWVdLF0kcG9wdWxhcml0eSwNCiAgICAwDQogICkNCiAgZGlybm9tcyA8LSBpZmVsc2UoDQogICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8xW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgIGRpcmVjdG9yb3NjYXJzW2RpcmVjdG9yb3NjYXJzJG5hbWUgPT0gZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQgPT0gbW92aWVzJGRpcmVjdG9yXzFbbW92aWVdLF0kZGlyZWN0b3JfbmFtZSxdJG5vbWluYXRpb25zLA0KICAgIDApICANCiAgZGlyd2lucyA8LSBpZmVsc2UoDQogICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8xW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgIGRpcmVjdG9yb3NjYXJzW2RpcmVjdG9yb3NjYXJzJG5hbWUgPT0gZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQgPT0gbW92aWVzJGRpcmVjdG9yXzFbbW92aWVdLF0kZGlyZWN0b3JfbmFtZSxdJHdpbnMsDQogICAgMCkgDQogIA0KICBpZighKGlzLm5hKG1vdmllcyRkaXJlY3Rvcl8yW21vdmllXSkpKXsNCiAgICBkaXJlY3RvcmNyZWRpdHMgPC0gZGlyZWN0b3JjcmVkaXRzICsgaWZlbHNlKG5yb3coZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQ9PW1vdmllcyRkaXJlY3Rvcl8yW21vdmllXSxdKT4wLA0KICAgIGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkPT1tb3ZpZXMkZGlyZWN0b3JfMlttb3ZpZV0sXSRtb3ZpZV9jcmVkaXRzLA0KICAgIDUNCiAgKQ0KICAgIGRpcnN1bXBvcCA8LSBkaXJzdW1wb3AgKyBpZmVsc2UobnJvdyhkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZD09bW92aWVzJGRpcmVjdG9yXzJbbW92aWVdLF0pPjAsDQogICAgZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQ9PW1vdmllcyRkaXJlY3Rvcl8yW21vdmllXSxdJHBvcHVsYXJpdHksDQogICAgMA0KICApDQogICAgZGlybm9tcyA8LSBkaXJub21zICsgaWZlbHNlKA0KICAgICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8yW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgICAgZGlyZWN0b3Jvc2NhcnNbZGlyZWN0b3Jvc2NhcnMkbmFtZSA9PSBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZCA9PSBtb3ZpZXMkZGlyZWN0b3JfMlttb3ZpZV0sXSRkaXJlY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMsDQogICAgICAwKSAgDQogICAgZGlyd2lucyA8LSBkaXJ3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8yW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgICAgZGlyZWN0b3Jvc2NhcnNbZGlyZWN0b3Jvc2NhcnMkbmFtZSA9PSBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZCA9PSBtb3ZpZXMkZGlyZWN0b3JfMlttb3ZpZV0sXSRkaXJlY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApDQogIH0gZWxzZSBpZihpcy5uYShtb3ZpZXMkZGlyZWN0b3JfMlttb3ZpZV0pKXsNCiAgICB0b3RkaXJjcmVkcyA8LSBjKHRvdGRpcmNyZWRzLCBkaXJlY3RvcmNyZWRpdHMpDQogICAgYXZnZGlycG9wIDwtIGMoYXZnZGlycG9wLCBkaXJzdW1wb3ApDQogICAgdG90ZGlybm9tcyA8LSBjKHRvdGRpcm5vbXMsIGRpcm5vbXMpDQogICAgdG90ZGlyd2lucyA8LSBjKHRvdGRpcndpbnMsIGRpcndpbnMpDQogICAgbmV4dA0KICB9DQogIA0KICBpZighKGlzLm5hKG1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSkpKXsNCiAgICBkaXJlY3RvcmNyZWRpdHMgPC0gZGlyZWN0b3JjcmVkaXRzICsgaWZlbHNlKG5yb3coZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQ9PW1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSxdKT4wLA0KICAgIGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkPT1tb3ZpZXMkZGlyZWN0b3JfM1ttb3ZpZV0sXSRtb3ZpZV9jcmVkaXRzLA0KICAgIDUNCiAgKQ0KICAgIGRpcnN1bXBvcCA8LSBkaXJzdW1wb3AgKyBpZmVsc2UobnJvdyhkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZD09bW92aWVzJGRpcmVjdG9yXzNbbW92aWVdLF0pPjAsDQogICAgZGlyZWN0b3JzW2RpcmVjdG9ycyRkaWQ9PW1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSxdJHBvcHVsYXJpdHksDQogICAgMA0KICApDQogICAgZGlybm9tcyA8LSBkaXJub21zICsgaWZlbHNlKA0KICAgICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgICAgZGlyZWN0b3Jvc2NhcnNbZGlyZWN0b3Jvc2NhcnMkbmFtZSA9PSBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZCA9PSBtb3ZpZXMkZGlyZWN0b3JfM1ttb3ZpZV0sXSRkaXJlY3Rvcl9uYW1lLF0kbm9taW5hdGlvbnMsDQogICAgICAwKSAgDQogICAgZGlyd2lucyA8LSBkaXJ3aW5zICsgaWZlbHNlKA0KICAgICAgbnJvdyhkaXJlY3Rvcm9zY2Fyc1tkaXJlY3Rvcm9zY2FycyRuYW1lID09IGRpcmVjdG9yc1tkaXJlY3RvcnMkZGlkID09IG1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSxdJGRpcmVjdG9yX25hbWUsXSkgPiAwLA0KICAgICAgZGlyZWN0b3Jvc2NhcnNbZGlyZWN0b3Jvc2NhcnMkbmFtZSA9PSBkaXJlY3RvcnNbZGlyZWN0b3JzJGRpZCA9PSBtb3ZpZXMkZGlyZWN0b3JfM1ttb3ZpZV0sXSRkaXJlY3Rvcl9uYW1lLF0kd2lucywNCiAgICAgIDApDQogICAgDQogICAgICB0b3RkaXJjcmVkcyA8LSBjKHRvdGRpcmNyZWRzLCBkaXJlY3RvcmNyZWRpdHMpDQogICAgICBhdmdkaXJwb3AgPC0gYyhhdmdkaXJwb3AsIGRpcnN1bXBvcC8zKQ0KICAgICAgdG90ZGlybm9tcyA8LSBjKHRvdGRpcm5vbXMsIGRpcm5vbXMpDQogICAgICB0b3RkaXJ3aW5zIDwtIGModG90ZGlyd2lucywgZGlyd2lucykNCiAgfSBlbHNlIGlmKGlzLm5hKG1vdmllcyRkaXJlY3Rvcl8zW21vdmllXSkpew0KICAgIHRvdGRpcmNyZWRzIDwtIGModG90ZGlyY3JlZHMsIGRpcmVjdG9yY3JlZGl0cykNCiAgICBhdmdkaXJwb3AgPC0gYyhhdmdkaXJwb3AsIGRpcnN1bXBvcC8yKQ0KICAgIHRvdGRpcm5vbXMgPC0gYyh0b3RkaXJub21zLCBkaXJub21zKQ0KICAgIHRvdGRpcndpbnMgPC0gYyh0b3RkaXJ3aW5zLCBkaXJ3aW5zKQ0KICAgIG5leHQNCiAgfQ0KfQ0KYGBgDQpBbmQgd2l0aCB0aGF0LCB3ZSBoYXZlIG91ciBlbmdpbmVlcmVkIGZlYXR1cmVzLiBOb3RlIHRoYXQsIGR1ZSB0byBhIHBlcnNpc3RlbnQgaXNzdWUgd2l0aCB0aGUgc2NyYXBlciAtIG5vdCBhbGwgb2YgdGhlIGFjdG9yIGlkcyB3ZXJlIGZvdW5kIGluIHRoZSBkYXRhYmFzZSBmb3Igc29tZSByZWFzb24gLSB3ZSBhcmUgZGVmYXVsdGluZyBhbnkgYWN0b3JzIHRoYXQgY291bGRuJ3QgYmUgZm91bmQgd2l0aCAxMCBtb3ZpZSBjcmVkaXQgYW5kIDUgcG9wdWxhcml0eSwgYWJvdXQgdGhlIG1lYW4gb2YgZWFjaCB2YXJpYWJsZSBkaXNjb3ZlcmVkIGZyb20gb3VyIGRhdGEgZXhwbG9yYXRpb24uIExldHMgYWRkIHRoZW0gb24gdG8gb3VyIGRhdGFzZXQ6DQpgYGB7cn0NCm1vdmllcyR0b3RhbF9hY3Rvcl9jcmVkaXRzIDwtIHRvdGFjdGNyZWRzDQptb3ZpZXMkYXZlcmFnZV9hY3Rvcl9wb3B1bGFyaXR5IDwtIGF2Z2FjdHBvcA0KbW92aWVzJGFjdG9yX29zY2FyX25vbWluYXRpb25zIDwtIHRvdGFjdG5vbXMNCm1vdmllcyRhY3Rvcl9vc2Nhcl93aW5zIDwtIHRvdGFjdHdpbnMNCm1vdmllcyR0b3RhbF9kaXJlY3Rvcl9jcmVkaXRzIDwtIHRvdGRpcmNyZWRzDQptb3ZpZXMkYXZlcmFnZV9kaXJlY3Rvcl9wb3B1bGFyaXR5IDwtIGF2Z2RpcnBvcA0KbW92aWVzJGRpcmVjdG9yX29zY2FyX25vbWluYXRpb25zIDwtIHRvdGRpcm5vbXMNCm1vdmllcyRkaXJlY3Rvcl9vc2Nhcl93aW5zIDwtIHRvdGRpcndpbnMNCmBgYA0KQWxtb3N0IERvbmUhICBUaGUgbGFzdCBiaXQgd2UgaGF2ZSB0byBkbyBpcyB0YWNrIG9uIHRoZSBjbGFzc2lmaWVyIHZhcmlhYmxlcy4gIE5vdGUgdGhhdCB3ZSBoYXZlIDMgY2F0ZWdvcmllcyBoZXJlIC0gbm90IG5vbWluYXRlZCwgbm9taW5hdGVkLCB3aW5uZXIuICBGb3IgdXMsIHdlIGFyZSB0cmVhdGluZyB0aGUgbm9taW5hdGlvbiBjYXRlZ29yeSBhcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgd2lubmVyIGNhdGVnb3J5LiAgVGhpcyBhbGxvd3MgdXMgdG8gY3JlYXRlIGR1bW15IHZhcmlhYmxlcyBmb3IgdGhpcyBjYXRlZ29yeSAtIG9uZSBmb3Igbm9taW5hdGVkLCBhbmQgb25lIGZvciB3aW5uaW5nLiAgVGh1cywgaWYgYm90aCBhcmUgMCwgdGhlbiB0aGUgbW92aWUgaXMgbm90IG5vbWluYXRlZCBmb3IgYW4gb3NjYXIgYXQgYWxsLg0KDQpPbmUgbW9yZSB0aGluZyAtIF9VcF8gYW5kIF9Ub3kgU3RvcnkgM18gYXJlIGEgYml0IHNwZWNpYWwuICB0aGV5J3JlIHRoZSBvbmx5IGFuaW1hdGVkIG1vdmllcyBpbiB0aGlzIGRhdGFzZXQgdGhhdCB3ZXJlIG5vbWluYXRlZCBmb3IgYm90aCBhbmltYXRlZCBmZWF0dXJlIEFORCBiZXN0IHBpY3R1cmUuICBTbywgd2UnbGwgZHVwbGljYXRlIHRob3NlIHJvd3MgZmlyc3QsIGFuZCB3aGVuIHdlIHJ1biBpbnRvIHRoZW0sIHdlJ2xsIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkuDQoNCmZpcnN0LCBkdXBsaWNhdGluZyB0aGUgcm93cy4gIF9VcF8gaXMgcm93IDExMjMsIHNvIGxldHMgZHVwbGljYXRlIGl0Og0KYGBge3J9DQptb3ZpZXMgPC0gcmJpbmQobW92aWVzW2MoMToxMTIzKSxdLCBtb3ZpZXNbMTEyMyxdLCBtb3ZpZXNbYygxMTI0Om5yb3cobW92aWVzKSksXSkNCmBgYA0KDQpOZXh0IGlzIF9Ub3kgU3RvcnkgM18sIHdoaWNoIGlzIHJvdyA3Nzg6DQpgYGB7cn0NCm1vdmllcyA8LSByYmluZChtb3ZpZXNbYygxOjc3OCksXSwgbW92aWVzWzc3OCxdLCBtb3ZpZXNbYyg3Nzk6bnJvdyhtb3ZpZXMpKSxdKQ0KYGBgDQoNCg0Kbm93IGxldHMgYWRkIGluIG91ciBjYXRlZ29yaWVzIGFuZCBvdXIgY2xhc3NpZmljYXRpb24gdmFyaWFibGVzOg0KYGBge3J9DQpjYXRlZ29yeSA8LSB2ZWN0b3IoKQ0Kbm9taW5hdGVkIDwtIG51bWVyaWMoKQ0Kd29uIDwtIG51bWVyaWMoKQ0KdHMzIDwtIEZBTFNFDQp1cCA8LSBGQUxTRQ0KZm9yIChtIGluIGMoMTpucm93KG1vdmllcykpKSB7DQogIGlmKG1vdmllcyR0aXRsZVttXSA9PSAiVXAiICYmIHVwKXsNCiAgICBuZXh0DQogIH0NCiAgaWYobW92aWVzJHRpdGxlW21dID09ICJUb3kgU3RvcnkgMyIgJiYgdHMzKXsNCiAgICBuZXh0DQogIH0NCiAgaWYobnJvdyhtb3ZpZW9zY2Fyc1ttb3ZpZW9zY2FycyRtb3ZpZSA9PSBtb3ZpZXMkdGl0bGVbbV0sXSkgPiAwKXsNCiAgICBjYXRlZ29yeTwtIGMoY2F0ZWdvcnksIG1vdmllb3NjYXJzW21vdmllb3NjYXJzJG1vdmllID09IG1vdmllcyR0aXRsZVttXSxdJGNhdGVnb3J5KQ0KICAgIG5vbWluYXRlZCA8LSBjKG5vbWluYXRlZCwgbW92aWVvc2NhcnNbbW92aWVvc2NhcnMkbW92aWUgPT0gbW92aWVzJHRpdGxlW21dLF0kbm9taW5lZSkNCiAgICB3b24gPC0gYyh3b24sIG1vdmllb3NjYXJzW21vdmllb3NjYXJzJG1vdmllID09IG1vdmllcyR0aXRsZVttXSxdJHdpbm5lcikNCiAgICBpZihtb3ZpZXMkdGl0bGVbbV0gPT0gIlVwIikgdXAgPC0gVFJVRQ0KICAgIGlmKG1vdmllcyR0aXRsZVttXSA9PSAiVG95IFN0b3J5IDMiKSB0czMgPC0gVFJVRQ0KICB9ICBlbHNlIHsNCiAgICBpZihtb3ZpZXMkYW5pbWF0aW9uW21dID09IDEpIGNhdGVnb3J5IDwtIGMoY2F0ZWdvcnksICJBTklNQVRFRCBGRUFUVVJFIEZJTE0iKQ0KICAgIGlmKG1vdmllcyRhbmltYXRpb25bbV0gPT0gMCkgY2F0ZWdvcnkgPC0gYyhjYXRlZ29yeSwgIkJFU1QgUElDVFVSRSIpDQogICAgbm9taW5hdGVkIDwtIGMobm9taW5hdGVkLCAwKQ0KICAgIHdvbiA8LSBjKHdvbiwgMCkNCiAgfQ0KfQ0KbW92aWVzJGNhdGVnb3J5IDwtIGNhdGVnb3J5DQptb3ZpZXMkbm9taW5lZSA8LSBub21pbmF0ZWQNCm1vdmllcyR3aW5uZXIgPC0gd29uDQpgYGANCg0KDQpBbmQgd2l0aCB0aGF0LCBvdXIgYW5hbHl0aWNzIGRhdGFzZXQgaXMgY29tcGxldGUuICBMZXRzIHB1dCBpdCBiYWNrIGludG8gU1FMIHNvIHRoYXQgdGhlIG5leHQgZ3V5IChhbHNvIG1lKSBjYW4gdGFrZSBhIGxvb2sgYXQgaXQgYW5kIHN0YXJ0IG1vZGVsaW5nLg0KYGBge3J9DQpkYldyaXRlVGFibGUoY29uLG5hbWUgPSAibW92aWVzZmluYWwiLCB2YWx1ZSA9IG1vdmllcywgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCkFsbCBmaW5pc2hlZCEgTGV0cyBkb3VibGUgY2hlY2sgaWYgdGhhdCB3b3JrZWQ6DQpgYGB7cn0NCmRiTGlzdFRhYmxlcyhjb24pICNzYW5pdHkgY2hlY2sgLSBzaG91bGQgc2hvdyA3IG5hbWVzDQpgYGANCk5vdyB0aGF0IHdlJ3JlIGRvbmUsIGxldHMgY2xvc2UgdGhpcyBjb25uZWN0aW9uLg0KYGBge3J9DQpkYkRpc2Nvbm5lY3QoY29uKQ0Kc2V0d2QoY3VycmVudHdkKQ0KYGBgDQo=